0

私の ap_hook_handler では、クエリ文字列の一部に URL エンコードされたエンティティが含まれている場合、request_rec->args で奇妙な動作が発生します。

ここに私の発見があります:

シナリオ #1: クエリ文字列の最初の 'e' をエンコードします。

http://localhost/test?group=%65従業員

結果:
r->uri: /test
r->args: "group= %mployees" (多くのスペースに注意してください)

シナリオ #2: 2 番目の「e」をエンコードします。

http://localhost/test?group=employ%65es

結果:
r->uri: /test
r->args: "group=employ 0.000000e-01s"

シナリオ #3: 最後の「e」をエンコードします。

http://localhost/test?group=employe%65s

結果:セグフォルト

パスの任意の部分 (クエリ文字列ではない) を URL エンコードすると、Apache は次のように動作します。

シナリオ #4: クエリ文字列の代わりにパスで「e」をエンコードします。

http://localhost/t%65st

結果:
r->uri: /test (予期される)
r->args: NULL (予期される)

'args' と 'uri' で URL エンコーディングの処理が異なるのはなぜですか? 'request_rec->uri' でできるように、モジュール内で正規化されたクエリ文字列を取得するにはどうすればよいですか?

4

1 に答える 1

0

ログに奇妙な結果が表示された理由は、クエリ文字列を引数として printf に渡し、パーセント記号が特殊文字だったためです。

これを ap_unescape_url 関数に渡して URL をデコードします。

考えてみると、これは本質的に URL の「データ」部分であり、パスに関連していないため、Apache が args パラメータを自動的にデコードしないことは理にかなっています。

于 2015-04-20T14:15:52.977 に答える