• 締切済み

apache クエリー文字

*.cgiをmod_rewriteでfunction.cgiに飛ばし、function.cgiから危険な関数等を見つけたらエラーを返し、問題がなかったら元の*.cgiを読み取る簡易スクリプトを書いたのですが、URL上で*.cgiにクエリ文字を追加すると500エラーが出るのですが、どういうことなんでしょうか? URL上でPATH_INFOをつけてからクエリ文字を付与すると正常に表示されます。

  • CGI
  • 回答数4
  • ありがとう数0

みんなの回答

回答No.4

#3さんので意味が分かりました。 cgi の後の文字のフィルタミスか。。 ぶっちゃけ、curl使う方が、シンプルだったりして^^ 結局、ApacheのURI解析を通さずCGI空間から ApacheのURI解析を再度やりたいならcurlの方が 絶対楽だったりはする(オーバーヘッドはでかめだが)

回答No.3

前の質問にあったけどリダイレクトされる前のもともとの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つ目は実ファイル名の取り出しに失敗してるのでこれが原因でしょう。 こういうのは、ここだけにしたテストコードを書いて実験してみと すぐにわかりますよ。

回答No.2

1 >*.cgi/path?aaa →OK 2 >*.cgi?aaa →NG なんですね。 ちなみ、CGIのソースはどうなってます? 1はPATH_INFOですが、 2はGETなので、 そこで、初期化ミスがある可能性があるものの、 ソースがないので判断できないのです。

humu01jp
質問者

補足

単純にテストと表示するだけのものでできなかったです。 初期化しないとできないんでしょうか?

回答No.1

前にも同じ質問を見たかもしれないが。 >問題がなかったら元の*.cgiを読み取る簡易スクリプトを書いた ここどうなってますか? ファイル名に"?~以降"を書くとその名前のファイルを探すので、 それはNGですよ。

humu01jp
質問者

補足

?以降は書いてませんが、URL上で*.cgi/path?aaaとかならアクセスできるけど、*.cgi?aaaですと、エラーが返ります。 なにがいけないんだかわからないです。

関連するQ&A

  • mod_rewriteについて

    Apacheのmod_rewriteを使って、aaa.cgiをいったんbbb.cgiにリダイレクトし、aaa.cgiの危険な関数を確認するためにソースコードをopen関数でチェックして、 問題がなければ、requireを使って$ENV{'REDIRECT_URL'}でaaa.cgiを読み込んであげるのですが、前者も後者もaaa.cgi/pathというようなPATH_INFOつきのアドレスだと、500 Internal server errorになってしまって表示できないのですが、解決方法はありますか? レンタルサーバー用のチェックシステムなんです。

    • 締切済み
    • CGI
  • Apache の mod_rewrite モジュールについて

    Apache の コーナーがなかったのでここに書きます。 mod_rewrite モジュールの RewriteRule に [QSA] というオプションがあるのですが、これは何でしょう? http://www.net-newbie.com/trans/mod_rewrite.html によると > このフラグは、置換文字列の中でマッチしたものを書き換えるのではなく、 そこにクエリー文字列部分を追加するように、書き換えエンジンに強制 します。書き換えルールを通してクエリー文字列に何かデータを追加したい 場合にこのフラグを使います。 らしいですが、意味が分かりません。。。 具体的に、[QSA] を付けた場合と付けない場合は、どうちがうのですか?

    • ベストアンサー
    • PHP
  • htaccessでのクエリ付URLのリダイレクト

    .htaccessにて、Perlで作成されたスクリプトのURLを以下のようにmod_rewriteで変換を行っています。 RewriteEngine on RewriteBase /cgi/ RewriteRule ^([0-z]+)/([0-z]+)\.html$ index.cgi?mode=$1&no=$2 通常の場合、 http://example.com/cgi/index.cgi?mode=pv&no=1 といったURLが、mod_rewriteにて http://example.com/cgi/pv/1.html というURL形式でアクセスが可能です。 そこでやりたい事なのですが、上記のpvの箇所をpastという風に変更したいと思っています。 http://example.com/cgi/pv/1.html http://example.com/cgi/past/1.html スクリプト側の問題かも知れませんが、過去ログに移行したデータなどはpastになるのですが、何故かpv(現行ログ)でもアクセス出来てしまいまして、出来れば.htaccessでpastに統一したいと思っています。 そこで単純ながら、Redirect permanentを使い、 Redirect permanent /cgi/view/ http://example.com/cgi/past/ としたところ、リダイレクトはされるのですが、 http://example.com/cgi/past/1.html?mode=view&no=1 となってしまいます。 語尾のクエリ部分「?mode=view&no=1」が出ないようにしたいのですが、どのような方法があるか、ご教示頂けますと幸いです。 RewriteCond %{QUERY_STRING}なども調べて見たのですが、詳しくどう記述すれば良いかわかりませんでした。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • apacheの mod_rewite の設定方法について

    Apacheの mod_rewrite の設定方法についてお聞きしたい事があります。 Perl等のURL その(1) http://localhost/cgi-bin/dir1/dir2/dir3/file.cgi?para='test'              |__________dir_________||__file_||__パラメータ_| というURLがあるとします。↑ 上記のディレクトリをパラメータとしておく場合↓ Perl等のURL その(2) http://localhost/cgi-bin/hoge.cgi?dir=/dir1/dir2/dir3/file.cgi?para='test'              |_別のファイル-||_______上記のdirとfileとパラメータ ------| という事を行いたいのですが、mod_rewriteをどのように設定すればいいのかが よくわかりません。 すいませんが、誰か教えていただけないでしょうか。

    • ベストアンサー
    • Perl
  • javascriptでクエリ文字列を取得できますか?

    javascriptでURLの末尾に付与した?以降の文字列、いわゆる"クエリ文字列"を取得する事は出来ますか? 出来る場合、構文を教えて下さい。

  • queryとparam

    下記のexecute_query関数はどのような処理を行う関数ですか? $paramの意味が分からないです。 // PDO、SQL文、$paramを利用してプリペアドステートメントを実行する function execute_query($db, $sql, $params = array()){ try{ $statement = $db->prepare($sql); return $statement->execute($params); }catch(PDOException $e){ set_error('更新に失敗しました。'); } return false; } // 添え字が '__error' のものをさらに配列として(二次元配列)要素を追加して変数 $errorの内容とする // $_SESSION['__error'] を配列として、エラー内容[]を追加している //(要素数が 0でなければ何らかのエラーがあって、その内容が記録されている) function set_error($error){ $_SESSION['__errors'][] = $error; }

    • ベストアンサー
    • PHP
  • apacheでCGIを動かす

    apacheでCGIを動かそうと思っていますが、どうしても出来ません。 環境は以下の通りです。 apache:1.3.35 OS:Windows2000 httpd.confの設定は 1.ScriptAlias /cgi-bin/ の行をコメントアウト 2.Alias /cgi-bin/ "E:/hoge/cgi-bin/"に変更してDirectoryタグを追加 3.AddHandler cgi-script .exeを追加 以上の3点をしましたが、新しく設定したディレクトリのcgiは動作しませんでした。 apacheのmodulesディレクトリの中にmod_alias.soというファイルが有りませんがそれは関係有るのでしょうか? また、apacheとtomcatの連携ということを以前行ったのですが、動かない事と関係あるのでしょうか? 文字数の関係で見づらい説明になっているかと思いますがよろしくお願い致します。

  • mod_rewriteの環境変数を埋め込みたい

    お世話になります。 現在、以下の環境でWebアプリケーションを開発しています。 CentOS5.4 Apache2.2.3 Tomcat7 JavaSE6 ApacheとTomcatの連携にmod_proxy_ajpモジュールを使用しています。 ただ、クライアントからアクセスするURLと連携先のURLが異なるため、Java側でHttpRequestからコンテキストパス以降を取得するとajp連携されたパスしか取得できず、クライアントがアクセスしたURI情報が取得できません。 これを対策するために、Apacheモジュールのmod_rewriteとmod_headersを利用して、 クライアントがアクセスしたURIをリクエストヘッダに埋め込もうとしています。 以下httpd.confに追加した設定です。 (rewrite.confも試しました) RewriteEngine On RewriteRule .* - [E=ORG_QUERY_STRING:%{QUERY_STRING}] RequestHeader append "test_query_string" %{ORG_QUERY_STRING}e 設定後、Apacheを再起動してWebアプリケーションにアクセスすると、リクエストヘッダ自体は追加されているのですが値が(null)となってしまい取得できません。 mod_rewriteの環境変数が取得できていないのかと思い、 RewriteRule .* - [E=ORG_QUERY_STRING:TEST] と固定文字列を埋め込んでも取得できませんでした。 このことからENVによる環境変数への設定、または参照が出来ていないのかと思われますが、どうにも解決できません。 参照時に RequestHeader append "test_query_string" %{ENV:ORG_QUERY_STRING}e としても同様の結果でした。 心当たりのある方、またはデバッグ方法や別解などアドバイスを頂けないでしょうか? なお、httpd.confではmod_rewrite、mod_headersのモジュール定義は有効となっております。 また、環境変数のスペルミスもコピペして確認しております。

  • ACCESS 追加クエリーで

    ACCESSで追加クエリーを作っていますが フィールド名が「PROPERTY & FUNCTION」というフィールドに追加したいのですが&という文字が入っているため、「PROPERTY&FUNCTION」と名前がかわってしまってうまく動作しません、””をつけてみたり、してみたのですができませんでした、 &を含むフィールド名へ追加するときの細工のしかた教えてください、 よろしくお願いします。

  • mod_rewriteでQUERYパラメータ数操作

    mod_rewriteで、静的化したいのですが、 QUERYパラメータ数が変化する場合には、どうすればよいでしょうか? ■現状 ▼URL /hoge.php?id=1 ▼.htaccess RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^hoge([0-9A-Za-z]+)\.html$ hoge.php?id=$1 [L] QUERYパラメータ数が一個のときは、 hoge1.htmlとなり、うまくいくのですが、 下記URLのようにQUERYパラメータがない場合があり、その場合に、エラーとなります(元のリンク自体も書き変えるので)。 /hoge.php QUERYパラメータ数が変化する(ない場合もある)時の.htaccessは、 どのように書けばよいのでしょうか? ・htaccess内で、条件分け可能なのでしょうか?

    • ベストアンサー
    • PHP

専門家に質問してみよう