6

PHP を実行している 2 つの Apache サーバーがあります。クエリ文字列でスラッシュを受け入れ、予想される方法で PHP に渡します。次に例を示します。

http://server/index.php?url=http://foo.bar

動作し、PHP では次の式が true になります。

$_REQUEST['url'] == "http://foo.bar"

しかし、他のApache サーバーでは、同じ URL は403 Forbiddenエラーになります。クエリ文字列が適切に URL エスケープされている場合 (つまり、%2Fスラッシュの代わりに使用されている場合)、すべてが機能することに注意してください。

これを引き起こす Apache または PHP の構成には明らかに違いがありますが、何が原因なのかわかりません!

どちらの場合も、この形式の URL を拒否するのではなく、受け入れる必要があります。

4

7 に答える 7

7

ここにあるいくつかの投稿は、OPの使用法が間違っていることを示唆していますが、これは誤りです。

Sam152のコメントを拡張すると、クエリ文字列には両方を含めることができますか?および/文字については、 http://www.ietf.org/rfc/rfc3986.txtのセクション3.4を参照してください。これは、基本的に、Webの動作方法を管理するTimBerners-Leeとその友人によって作成された仕様です。

問題は、適切に記述されていない(または適切に構成されていない、または誤用されている)パーサーが、クエリ文字列のスラッシュを分離パスコンポーネントとして解釈することです。

私は、URLを解析するために使用されているPHPのpathinfo関数の例を見てきました。Pathinfoは、URLを解析するために作成されたものではありません。ただし、parse_urlを使用してパスを抽出し、fileinfoを使用してパスから詳細を取得することはできます。parse_urlが/と?を処理することがわかります。クエリ文字列では問題ありません。

いずれにせよ、全体的な問題は、経験豊富な開発者の間でさえ、この領域が全体的によく理解されていないことであり、ほとんどの人(私自身も最近まで含まれています)は、ファイル名の後の何かをurlencodedする必要があると思い込んでいます。基準を考慮に入れてください。

tl;dr仕様を読む:)

于 2011-11-29T02:05:12.250 に答える
0

http://server/index.php?url=http://foo.barは有効な URL ではありません。スラッシュをエンコードする必要があります。ブラウザはこれを自動的に行うと思うので、別のブラウザでテストしていたのでしょうか?

それとも、AllowEncodedSlashesの設定でしょうか。

于 2009-01-20T19:36:05.627 に答える
0

インストールしていmod_securityますか?このスレッドを参照してください:

403 $_GET パラメータでエンコードされた URL で呼び出された PHP ページでは禁止されています

于 2010-01-05T22:22:15.557 に答える
0

あなたのApache設定で:

AllowEncodedSlashes On

詳細については、ドキュメントを参照してください:
http://httpd.apache.org/docs/2.2/mod/core.html#allowencodedslashes

編集:うーん、これはあなたがすでに取り組んでいるものかもしれません...私はこれと同じ問題を抱えていました。最終的にそれを修正した$_SERVER['REQUEST_URI']のは、必要なデータを持っているので使用することでした。

于 2009-01-20T19:46:46.133 に答える
-1

PHPがこのURLで何をするかを指定しないでください。このページにリダイレクトしますか、それとも読み込もうとしますか?

おそらく、二重スラッシュを削除するためのmod_rewriteルールがあるか、または他の目的で、これを本来あるべきではない場所にリダイレクトしようとします。

たぶんhttp://の前に^のない正規表現

于 2009-01-20T19:21:23.830 に答える
-1

クエリ文字列が適切に URL エスケープされている場合 (つまり、スラッシュの代わりに %2F を使用している場合)、すべてが機能することに注意してください。

したがって、クエリ文字列が適切にフォーマットされている場合は機能し、そうでない場合は機能しません。どうしたの?

于 2009-01-20T19:41:21.230 に答える
-1

これは、デフォルトの magic_quotes_gpc の別のケースのように思えます。問題を引き起こしているサーバーで php.ini をチェックし、

magic_quotes_gpc = Off
于 2009-01-20T17:37:25.380 に答える