CGI-BBS > 情報収集 > フォームメール > form2mail.cgiで参照チェックの対象URLを複数にしたい。


カレッヂ
カレッヂ


質問者 fitoncid  投稿日 2004/3/26(金) 05:19:47
ひとつの本体スクリプトform2mail.cgiを設置し、
それを複数のサイトから利用しようとしています。
セキュリティのために参照チェックは有効にしたいのですが
そのアクセス元を複数許可設定するところでつまづいています。

-------------------------------
#送信フォームのURLがここに設定した文字列を含まない場合は送信しない
$ref_url = 'aaa.com';

#■アクセス元をチェックする(いたずらで困っている場合のみ) 0:しない 1:する
$ref_check = 1;

if ($ref_check) {

	$ref = $ENV{'HTTP_REFERER'};
	$ref =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
	if (!($ref =~ /$ref_url/i)) { &error('Forbidden','実行できるフォーム以外からのアクセスを検知しました.'); }
}
-------------------------------

となっている部分を、

-------------------------------
#送信フォームのURLがここに設定した文字列を含まない場合は送信しない
@ref_url = ("aaa.com","bbb.jp");

#■アクセス元をチェックする(いたずらで困っている場合のみ) 0:しない 1:する
$ref_check = 1;

if ($ref_check) {

$ref = $ENV{'HTTP_REFERER'};
$ref =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

	foreach $var(@ref_url){
		if(!($ref =~ /$var/i)) { &error('Forbidden','実行できるフォーム以外からのアクセスを検知しました.'); }
	}

}
-------------------------------

とすれば良いかと思ったのですが、
これでは不備があるようで、許可したいサイトからもForbiddenになります。

どのように直せばよいか、ぜひアドバイスください。
よろしくお願いします。

プロバイダ参照:
サーバのOS:(未選択)
パソコンのOS:(未選択)
エディタ:
FTPソフト:
サーバ移転:していない
改造:している 改造前正常動作
CGI習熟度:middle

質問者 fitoncid  [削除]  投稿日 2004/3/26(金) 05:46:37
追加です。

今、投稿文をチェックしていて気づいたのですが
これでは
aaa.comがOKでもbbb.jpに一致しないからダメ
bbb.jpがOKでもaaa.comに一致しないからダメ
・・・
という意味になって、Forbiddenになるの当たり前でした…(^^;)。

でも、じゃあどうすれば?というのは、やっぱりわかりません。
どなたかお知恵いただけませんか?
よろしくお願いします!
回答者 しあわせのツボ  [削除]  投稿日 2004/3/26(金) 19:27:30
1. 正規表現にorで突っ込む。 if(/foo|bar/)〜
  条件が少ない場合に逃げる方法。コードが少なくて済む。
2. notを噛ませてandをとる。 if(!~ /foo/ && !~ /bar/)〜
  力技だが何をしたいかはわかる。条件が複雑な時の最後の手段。
3. foreachで回して真だったらフラグを立て、後でフラグを見る。 for(@array){if(/$foo/){++$flag;exit}};if($flag)〜
  コード量が条件数に影響されないので、条件が多い時に。
4. 条件はいじらず、処理ブロックをひっくり返してしまう。 if(/foo/){偽}else{真}
  これが最も簡単なこともある。
他にもあるでしょうが、このへんのどれかで組めるかと思います。
質問者 fitoncid  [削除]  投稿日 2004/3/27(土) 10:25:15
しあわせのツボさん、ありがとうございました。
フラグを使う方法で、バッチリ解決しました!

最終的な結果は同じでも、様々な条件の立て方や処理の導き方があるんですよね。
アタマが固いのか、なかなかその辺りに苦労が…(^^;)
おかげさまで、大変参考になりました。
どうもありがとうございました。

このページは終了したので返信(回答)は書きこめません
 


Web裏技