68user's page 掲示板

Prev< No. 3435〜3447> Next  [最新発言に戻る] [過去ログ一覧]
No. 3435 # 初心者 2003/12/03 (水) 15:35:15
あ、すみません。。。。半角カナ。

No. 3436 # 通りすがり 2003/12/03 (水) 16:06:26
>>3434 初心者
HP-UX11.0の環境で確認しましたが「==」で問題無く一致を検知できました。
「==」の前後に空白が無いと上記OSでは文法上のエラーになりました。
ご参考になれば。

No. 3437 # perler 2003/12/03 (水) 17:13:59
>3429
お早いお返事ありがとうございました。
質問の答えなのですが、同プログラム内で%FORMによみこんでおります。

sub func
{
my($query,$pair);

if($ENV{'REQUEST_METHOD'} eq 'POST'){
          read(STDIN,$query,$ENV{'CONTENT_LENGTH'};
}else{$query=$ENV{'QUERY_STRING'};}

foreach $pair (split/&/,$query){
          ($key,$value)=split(/=/,$pair);

#デコード処理

          $FORM{$key}=$value;
}

このサブルーチンで処理させております。

ちなみにただのメールフォームではなにも問題なく動作します。

No. 3438 # 超初心者 2003/12/03 (水) 17:45:24
BSD UNIX 類のどれか欲しいんですけどお勧めはありますか?

No. 3439 # 68user 2003/12/03 (水) 18:44:01
>>3437 perler
> <form action="$ENV{'SCRIPT_NAME'}?para2=data2" method='POST'>
という書き方をした場合、メソッドは POST ですが para2=data2 は
環境変数 QUERY_STRING 経由で渡されます。よって、
      POST なら標準入力から読む
というやり方では、QUERY_STRING からの入力は無視されてしまいます。

>>3438 超初心者
初心者ということであれば、FreeBSD 4.9-RELEASE がお勧めです。
      http://www.h4.dion.ne.jp/~katsuwo/index.html

No. 3440 # zsh 2003/12/03 (水) 19:08:10
>>3434 初心者
シェルの一行目を
#/bin/csh -x
に変更して再実行すれば
実際に変数に何が入ってくるか確認できますよ。

No. 3441 # 初心者 2003/12/04 (木) 10:15:13
No. 3436 の通りすがりさん、No. 3440 zshさん、 書き込みありがとうございます
  私の環境が違うのかも知れません。下記のように表示されてるので。
Digital UNIX V4.0B (Rev. 564
Digital UNIX Japanese Support V4.0A (rev. 3.1)


で、やっぱりおっしゃるとおり実行したのだけど、だめなんです。
if ( $a == $b )
の、右辺の変数名が、分かりません、とかそう言うエラーが出るので、

結局
@ df=$a - $b
if ($df == 0 )
で、何とかうまくいきました。

ありがとうございました。

No. 3442 # Mule 2003/12/04 (木) 16:54:25
>>3431 68user

こんにちは、Muleです。
すみません、コマンドでtelnet起動、失敗しました(^^;
これが出来たら、結構使えるスクリプトになるかもと思っていたのですが、やはり無理がありますかね...

コード全体の流れとしては、
プロキシのチェックルーチンをよび、flagが立っていればif分岐、という典型的な処理です。

if($flag){

#telnetを起動し、接続元をファイルに記録する処理

}
else{
my $img = 'file.gif';
my $byte = (stat $img)[7];

print "Content-Type: image/gif\n";
print "Content-Length: $byte\n\n";

open IMG,$img;
binmode((binmode(IMG),$|=1)[0]);

print map {$_} <IMG>;

close IMG;

}

やはり、イメージで呼び出すという方式では、FTPで、というのが、現実的でしょうか?

socketと組み合わせれば、なんとかなりそうな気がしていろいろ試してみましたが...上手く行かないものですね。

No. 3443 # 68user 2003/12/04 (木) 19:08:33
>>3442 Mule
わたしは
      http は proxy 経由かもしれないが、ftp や telnet は
      proxy 経由でないことを期待して、クライアント側から
      ftp や telnet でサーバに接続させるように仕向けて、
      IP アドレスを取得する
と思っていたのですが、そうではないようですね。

> コード全体の流れとしては、プロキシのチェックルーチンをよび、
> flagが立っていればif分岐、という典型的な処理です。
「proxy のチェック」というのは公開 proxy サーバかどうかを
調べるため、クライアントの IP アドレスに接続してみる、という
ことですよね。

telnet で接続、というのは
      http://x68000.startshop.co.jp/~68user/unix/pickup?sleep
てな方法でできます。もちろん代わりに Socket を使ってもいいです。
方法はともかく、公開 proxy かどうかの判断はやろうと思えばできます。

で、なぜ
      if($flag){
            #telnetを起動し、接続元をファイルに記録する処理
      }
と proxy チェックルーチンを呼んだ後 ($flag が確定した後) に
もう一度 telnet を実行する必要があるのでしょうか?

      #telnet を起動し、クライアントの IP アドレスに接続。
      #接続できたら $flag=1;

      if($flag){
            #接続元をファイルに記録する処理
            open(LOG, ">log");
            print LOG "$ENV{REMOTE_ADDR} is open proxy\n";
            close(LOG);
      }

とすればよいのではないですか?

No. 3444 # perler 2003/12/04 (木) 20:09:43
>>3439 68user
お返事ありがとうございました。
なるほど、それがperlの仕様なんですね^^
原因がわかりました。

実は
<form action="$ENV{'SCRIPT_NAME'}?para2=data2 method='POST'>
<input type="hidden" name="mode" value="res">
<input type="submit" value="返信">
</form>
とやっていたためPOSTとGETが混在してしまっていたようでした。
この形ではPOSTをGETにかえても成功しませんでした。

管理人さんの助言でこれに気づくことができました。
どうもありがとうございました。

結果だけお伝えしておきます。

method='POST'の場合
          http://xxx.cgi?para2=data2となりmode=resがおくられない。

method='GET'の場合
          http://xxx.cgi?mode=resとなりpara2=data2がおくられない。
でした。

No. 3445 # 68user 2003/12/04 (木) 20:48:29
>>3444 perler
> なるほど、それがperlの仕様なんですね^^
perl とは関係ないです。これは HTML と CGI の領域です。

apache-1.3.29・IE6・Mozilla-1.5 で試した結果、
> method='GET'の場合
> http://xxx.cgi?mode=resとなりpara2=data2がおくられない。
これは正しいです。正確に言うと
    「ブラウザが para2=data2 を送らない」
です。

> method='POST'の場合
> http://xxx.cgi?para2=data2となりmode=resがおくられない。
これは間違いです。標準入力を解析していないだけ、でしょう。


以下の CGI スクリプトを実行し、GET と POST それぞれで
QUERY_STRING と標準入力にどういう値が入っているか確認
してください。

-------
#!/usr/local/bin/perl

print "Content-type: text/html\n\n";

$script_name = $0;
$script_name =~ s|.*/||;

print <<END;
<html><body>
<form action="$script_name?para2=data2" method='GET'>
<input type="hidden" name="mode" value="res">
<input type="submit" value="GET">
</form>
<form action="$script_name?para2=data2" method='POST'>
<input type="hidden" name="mode" value="res">
<input type="submit" value="POST">
</form>
END

print "REQUEST_METHOD=$ENV{REQUEST_METHOD}<br>\n";
print "QUERY_STRING=$ENV{QUERY_STRING}<br>\n";
print "STDIN=\n";
print <STDIN>;

No. 3446 # perler 2003/12/05 (金) 00:22:19
>>3445 68user
お返事ありがとうございました。

なるほど、標準入力を解析しないということがわかりました。
パラメーターを指定しているのにPOSTをつかったのがいけなかったようですね。

またGETをつかってもパラメーターを送らないので素直に違う方法を考えます。

ご教授ありがとうございました。

No. 3447 # Mule 2003/12/05 (金) 16:43:47
>>3443 68user

こんにちは、Muleです。
ご返事、ありがとうございます。

中途半端なコードを書いたせいか、誤解があったようですが、わたしも68user様が言われた、
    
>http は proxy 経由かもしれないが、ftp や telnet は
>proxy 経由でないことを期待して、クライアント側から
>ftp や telnet でサーバに接続させるように仕向けて、
>IP アドレスを取得する

という、まさにそのことを考えております。

proxyのルーチンは、proxy経由かどうかを最初にチェックする為のもので、
httpからのアクセスがproxy経由でなければ、画像を出力し普通に接続元を記録する。
そうでなければ、クライアント側からtelnetでサーバに接続させて、接続元を記録する、という流れです。
FTPと書いたのは、わたしのほうで、FTPを用意し、CGIから出力する画像の参照元に、FTPサーバにある画像を指定して出力させれば、FTPのログに元の接続先が残るのではないかと思うからです。

考え方として、何か大きな間違いをおかしているでしょうか?
ご指摘いただければ、幸いです。

Prev< No. 3435〜3447> Next  [最新発言に戻る] [過去ログ一覧]