GEEKy Script Writer [perl and more!]
You should permit the JavaScript!!
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
apeboard+のソースがだめだめすぎるので勝手に添削
先日、知り合いに頼まれてapeboard+を設置したわけですが、なんかリファラはじきのところがおかしい。
というわけで、処理部分を覗いてみたんですが、これがまた!!

詳細は追記に。
事の発端は、許可するリファラを複数指定しようとしたあたり

boardini.cgi L:111付近
# 書込むサイトのURL                                                 ____.27
#(フルURLで指定。他のサイトからの書き込みチェックに使用)
#(複数指定する場合はカンマで区切る)
$site = 'http://xxx.ne.jp/apeboard_plus.cgi';

おー、複数指定とは斬新ね!と感心したのもつかの間で、
複数指定すると正しいリファラを吐き出しても蹴られてしまう。
なんぞこれ!!というわけで問題部分の処理が、
apeboard_plus.cgi L:1602付近
sub check_fromsite {
my($ref) = $ENV{'HTTP_REFERER'};
$ref =~ s/\?.*//;
@frmsite = split(/\,/,$site);
foreach (@frmsite) {
if (!($ref =~ /$_/)){
print_error("外部からの書き込みはできません");
}
}
}

KENTイズムが全開なのはまあ許すとして、これじゃどう考えても複数許可になるはずがない。
まず大問題の箇所以外のだめだめポイントを挙げていくと、
・$ref =~ s/\?.*//; これでURL引数を消してるのはいいんだけど、http://どこぞの鯖/外部からのやつ.cgi/http://正規リファラ とかされると普通に無問題で書き込めそう。でもまあこれは仕方ないか。
・なぜ$refはmyでローカル変数にしてるのに、@frmsiteはローカル変数にしてないのか。そもそも@frmsiteいらん。
・if(!($ref =~ /$_/))←ふざけてるの?
んで、問題の箇所は、許可リファラを複数指定してるのに、1つでも合致しないとエラーを出してるところ。
そしてこれらを修正すると、
sub check_fromsite {
my($ref) = lc$ENV{'HTTP_REFERER'};
index($ref,lc)==0 && return for split /,/,$site;
print_error("外部からの書き込みはできません");
}

これでいけるはず。

テーマ:プログラミング - ジャンル:コンピュータ

コメント
この記事へのコメント
管理人のみ閲覧できます
このコメントは管理人のみ閲覧できます
2012/03/28 (水) 19:33:23 | | #[ 編集]
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
copyright © 2005 GEEKy Script Writer [perl and more!] all rights reserved.
Powered by FC2ブログ.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。