orをフォームのアクションとして、またはリンクの href として$_SERVER['REQUEST_URI']
使用するリスクはありますか?$_SERVER['PHP_SELF']
もしそうなら、リスクを軽減するために何ができるでしょうか?
orをフォームのアクションとして、またはリンクの href として$_SERVER['REQUEST_URI']
使用するリスクはありますか?$_SERVER['PHP_SELF']
もしそうなら、リスクを軽減するために何ができるでしょうか?
www.example.com/form.php でフォームを作成します。1 年後、URL が、ページがロードされている URL を取得しているだけであることを忘れています。
ある時点で、まったく異なる (少し変わった) 要求の一部として、フレームワークに「すべてを削除する」グローバル オプションを追加したとします。
ここで、誰かが次のリンクをあなたに送信します: www.example.com/form.php?delete_everything=true。その URL を取得してアクションとして設定しているだけなので、それがフォームのアクションになります。おっとっと。XSS 攻撃は基本的にこのように機能します。
あなたのコードは、最初にコードを書いたときに予期しない方法で (あなたによって、特にハッカーによって) 使用されることを常に想定してください。
どのようにそれを回避しますか?URL をハードコーディングしてください。URL を返す関数を含めることができます。実際、これは Symfony や CodeIgniter のようなフレームワークがそれを解決する方法です。
$_SERVER は XSS 攻撃に対して脆弱であり、使用する前に htmlspecialchars() を使用してクレンジングする必要があります。
インジェクションの例:
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"></form>
次に、インジェクションを使用して次のフォームを呼び出します。
http://www.example.com/form.php/%22%3E%3Cscript%3Ealert (「xss 攻撃」)%3C/script%3E%3Cbr%20class=%22irrelevant
常に入力データを消去することを忘れないでください...常に!
これは、適切にエスケープしないと$_SERVER['PHP_SELF']
、XSS 攻撃で使用できる$_SERVER['REQUEST_URI']
ように操作できるためです。
これは、次のような URL が問題なく機能するという事実によって可能になります。
/path/to/index.php/" onmouseover="alert('hi')
このコードを使用しましょう:
<form action="<?php echo $_SERVER['PHP_SELF']; ?>">
...
</form>
/path/to/index.php
、つまりを呼び出しますSCRIPT_NAME
が、単にエコー$_SERVER['PHP_SELF']
すると、意図した HTML が壊れます。
<form action="/path/to/index.php/" onmouseover="alert('hi')">
...
</form>
ソリューション
多くの場合、<form action="">
フォームをスクリプト自体にポストするには、を使用するだけで十分です。それ以外の場合、スクリプトが呼び出されていることがわかっている場合は"bla.php"
、 を設定しaction="bla.php"
ます。
これはかなり古い投稿であることは承知していますが、これは私がしばらく前に苦労した問題でもあります。私が今していることはこれです:
$php_self = filter_input(INPUT_SERVER, 'PHP_SELF', 522);
define('PHP_SELF', $php_self);
これにより、定数 PHP_SELF をフォーム アクションとして安全に使用できます。$_SERVER['PHP_SELF']
このコードのビットが行うことは、結果を変数として割り当てながら、フィルタを介してスーパー グローバルを実行することです$php_self
。FILTER_SANITIZE_FULL_SPECIAL_CHARS
ID番号522は、誰かがjavascriptなどを挿入する機能を削除することを指します。
このコードで利用できるフィルタは次のとおりです。
<table>
<tr><td>Filter Name</td><td>Filter ID</td></tr>
<?php
foreach(filter_list() as $id =>$filter)
{
echo '<tr><td>'.$filter.'</td><td>'.filter_id($filter).'</td></tr>'."n";
}
?>
</table>
$_SERVER
スーパーグローバル変数のすべてではないにしても、ほとんどに同じ原則を適用できます。
以下は、私のお気に入りのプレイの一部です。
# FILTER_SANITIZE_STRING or _STRIPPED
$server_http_xrw = filter_input(INPUT_SERVER, 'HTTP_X_REQUESTED_WITH', 513);
# FULL_SPECIAL_CHARS
$server_request_method = filter_input(INPUT_SERVER, 'REQUEST_METHOD', 522);
$http_encoding = filter_input(INPUT_SERVER, 'HTTP_ACCEPT_ENCODING', 522);
とにかく、PHP の (現在の) 組み込みフィルターを利用することで、$_SERVER
あまり心配することなく変数を使用できます。
これが、答えを探してこのスレッドに迷い込んだ人の助けになることを願っています。
いいえ、誰でもhref
リンクの を変更できます (Firebug などのツールを使用)。もちろん、そのリンクに機密データを入れないようにしてください。
受け取ったユーザー データを常に正しく検証し、解析してください。