web-dev-qa-db-ja.com

どのコンポーネントがURLでphpのGETパラメータを処理するか

Webサーバーでは、どのコンポーネントがRLパラメーターの$_GETグローバルへの変換変数を処理しますか?

それはPHPエンジンのモジュールですか、それともWebサーバー(Apache、Nginx)のモジュールですか?

GET(パラメーターが既にリンクの一部であるPOST /意味のあるリンクのみ)を使用していないため、誰かが誤って使用しないように$_GETを無効にする方法を探していたので、私は尋ねています。

最終目標は、HTTPのGETメソッドをブロックすることではなく、RLのパラメーターを読み取り、これらをPHPの$_GET。に変換するロジックを無効化/削除するだけです

可能であれば物理的に削除したい(モジュールファイルを消去する)これを処理するモジュール。そうでない場合は、PHPとWebサーバーの両方でそのオプションを設定します(両方のパッケージにGETのロジックがある場合)。

2
GameDeveloper

GET/POSTは、データを要求/送信するHTTPヘッダーです。これらは最初にサーバーによって処理され、標準のHTTP要求メソッドの一部です。

Apacheでこれを行うには、ドメイン設定の上部で:

<Limit GET>
deny from all
</Limit>

OPTIONSリクエストをサーバーに送信することにより、使用可能なメソッドをテストできます。これにより、サーバー側で受け入れられるすべての可能なメソッドが返されます。

編集:質問が変更されてからの新しい回答。

ApacheのPHPモジュールは無効にできますが、PHPファイルを解析できません。あなたがやろうとしているのは、クエリ文字列の使用を防ぐことです。ここでの答えは、PHPファイルが解析され実行されるときに渡される前にそれらを書き換えることです。書き換えでクエリ文字列を削除するようにApacheを構成する必要があります。

RewriteEngine    On
RewriteCond      %{QUERY_STRING}    *.
RewriteRule      (.*)               $1?     [R=permanent]
2
L Martin

$_GET PHPスーパーグローバルは、Apacheで利用可能になったURLのクエリ文字列(リクエストヘッダー)を解析するときにPHPによって設定されます。私が知る限り、PHPがこれを行うのを防ぐことはできません。

ただし、スクリプトの上部でこの変数をリセットできます。例えば。 $_GET = Array();

また、ApacheがURL /クエリ文字列を解析するのを防ぐこともできません。これはすべてのWebサーバーに固有のものです。 Apacheはクエリ文字列全体を解析するだけで、URLパラメータに分離しません-これはサーバー側の言語パーサー(この場合はPHP)が行います。

最善の方法は、クエリ文字列を含むリクエストをブロックするか、正規URLにリダイレクトすることです(ユーザーはいつでもクエリ文字列をリクエストに追加できるため)。

たとえば、Apacheでmod_rewriteを使用してサーバー構成でクエリ文字列を含むリクエストをブロックするには(つまり、403 Forbiddenを送信します):

RewriteEngine On
RewriteCond %{QUERY_STRING} .
RewriteRule ^ - [F]

または、同じURLにリダイレクトするには、クエリ文字列を減らします

RewriteEngine On
RewriteCond %{QUERY_STRING} .
RewriteRule ^ %{REQUEST_URI}? [R=301,L]

Apache 2.4では、QSDsubstitutionの最後に?を追加する代わりに、RewriteRuleパラメーターを使用してクエリ文字列を破棄できます。すなわち。 RewriteRule ^ %{REQUEST_URI} [QSD,R=301,L]

リクエストからクエリ文字列を削除すると、PHP $_GETスーパーグローバルは自然に空になります。

1
MrWhite