- 締切済み
apache クエリー文字
*.cgiをmod_rewriteでfunction.cgiに飛ばし、function.cgiから危険な関数等を見つけたらエラーを返し、問題がなかったら元の*.cgiを読み取る簡易スクリプトを書いたのですが、URL上で*.cgiにクエリ文字を追加すると500エラーが出るのですが、どういうことなんでしょうか? URL上でPATH_INFOをつけてからクエリ文字を付与すると正常に表示されます。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- AsarKingChang
- ベストアンサー率46% (3467/7474)
#3さんので意味が分かりました。 cgi の後の文字のフィルタミスか。。 ぶっちゃけ、curl使う方が、シンプルだったりして^^ 結局、ApacheのURI解析を通さずCGI空間から ApacheのURI解析を再度やりたいならcurlの方が 絶対楽だったりはする(オーバーヘッドはでかめだが)
- superside0
- ベストアンサー率64% (461/714)
前の質問にあったけどリダイレクトされる前のもともとのURL ( test.cgi/pathとか、test.cgi?aaaとか 、test.cgi/path?aaa) を、$ENV{'REDIRECT_URL'} から取り出して そこからPATH_INFOやGETパラメータ(クエリ文字)を取り除いて ファイル名のみにしてから、 そのCGIファイルをperlから読み出ししようとしているってことですよね? REDIRECT_URLから ファイル名だけに切り取る処理として 前の質問にあった 「$ENV{'REDIRECT_URL'} =~ s/\.cgi\/([\w|\!\#\&\=\-\%\@\~\;\+\: \.\?\/]+)$/\.cgi/g;」 を使ってるのなら この正規表現では *.cgiのあとに /があるという記述で書いてあるので、これだと test.cgi/path → test.cgi test.cgi?aaa →test.cgi?aaa test.cgi/path?aaa →test.cgi に置換されますね。 2つ目は実ファイル名の取り出しに失敗してるのでこれが原因でしょう。 こういうのは、ここだけにしたテストコードを書いて実験してみと すぐにわかりますよ。
- AsarKingChang
- ベストアンサー率46% (3467/7474)
1 >*.cgi/path?aaa →OK 2 >*.cgi?aaa →NG なんですね。 ちなみ、CGIのソースはどうなってます? 1はPATH_INFOですが、 2はGETなので、 そこで、初期化ミスがある可能性があるものの、 ソースがないので判断できないのです。
- AsarKingChang
- ベストアンサー率46% (3467/7474)
前にも同じ質問を見たかもしれないが。 >問題がなかったら元の*.cgiを読み取る簡易スクリプトを書いた ここどうなってますか? ファイル名に"?~以降"を書くとその名前のファイルを探すので、 それはNGですよ。
補足
?以降は書いてませんが、URL上で*.cgi/path?aaaとかならアクセスできるけど、*.cgi?aaaですと、エラーが返ります。 なにがいけないんだかわからないです。
補足
単純にテストと表示するだけのものでできなかったです。 初期化しないとできないんでしょうか?