0

侵入テストアプリを実行したところ、大量の XSS エラーが見つかりました。具体的には、未検証のデータをクエリ文字列を介してブラウザにエコーバックした罪があります。

具体的には、これを実行すると JavaScript がページに挿入されます。 http://www.mywebsite.com/search.php?q=%00 '" [ScRiPt]%20%0a%0d>alert(426177032569)%3B[/ScRiPt].

ありがたいことに、ユーザーがデータベースにデータを保存して他のユーザーに表示できるようにする場所がないので、この問題で自分自身をハッキングすることしかできないと思いますが、それでも修正したいと思います。

これを行うことをお勧めします。

echo htmlentities($_POST[‘input’], ENT_QUOTES, ‘UTF-8’);

しかし、現在、私はこれをできるだけ早くパッチを当ててから、ケースバイケースで修正する必要があります. サイトのすべてのページにインクルードするヘッダー ファイルがあります。それが悪い形式であることはわかっていますが、そうすると何が問題になる可能性がありますか。

array_walk($_POST, 'htmlentities');  

COOKIE と GET についても同様に行う必要があります。_REQUEST は使用しません。

ありがとう

4

4 に答える 4

3

途中での HTML エスケープは明らかに間違いですが、コードを適切なものに置き換えるまでの一時的な修正になる可能性があります。長期的には維持できず、 & エンコードされた文字全体で部分文字列操作 (データベースが自動的に行う可能性のある切り捨てを含む) を開始すると、奇妙なアプリケーションレベルのエラーが大量に発生します。セキュリティ侵害につながる可能性はそれほど高くありませんが、アプリをより詳細に見ないとわかりません.

毎回 $_SESSION でエンコードを開始すると、 &amp のような長すぎる文字列が多重エンコードされます。 ; 非常に迅速に。

人々は自分自身をハッキングすることしかできないと思います

または、別の Web ページの攻撃者が、あなたのサイトにそっくりな偽のログイン ボックスを表示するのに十分なスクリプトを挿入して、ユーザー名とパスワードを収集したり、アカウントを自動的に削除したりして、あなたのページにリダイレクトまたは iframe する可能性があります。そのようなもの。あまりよくない。

これを行うことをお勧めします: echo htmlentities($_POST['input'], ENT _QUOTES, 'UTF-8');

htmlentities とこれらすべてのパラメーターは必要ありません。htmlspecialchars を使用してください。

次のようなものを使用して、いくつかのキープレスを節約できます。

function h($s) { echo(htmlspecialchars($s)); }
...
<?php h($POST['input']) ?>

それは本当にそれほど面倒なことではありません。

于 2009-01-16T22:54:42.753 に答える
2

フロントエンドですべての入力を盲目的にエスケープするということは、その入力を処理するプログラムのすべての部分で、htmlエスケープバージョンの<、>、&などを処理する必要があることを意味します。データベースにデータを格納している場合は、データベースにhtmlエスケープされたデータがあります。HTML以外のコンテキスト(メールの送信など)でデータを使用すると、&lt;が表示されます。<などの代わりに

おそらく、出力するときにエスケープしたいだけです。

于 2009-01-16T19:30:26.207 に答える
1

私の最初の回答は、最初に、プレゼンテーション ロジックがビジネス ロジックなどとは別に処理されるようにすることを提案することです。

プレゼンテーション ロジックが実際に分離されている場合は、現在どのように画面に出力しているかを評価する必要があります。画面へのすべての出力をエスケープする同じ関数呼び出しを使用して、すべての出力を実行できますか?

たとえば、実際に画面に出力するときに clean_output を呼び出しますが、データベース操作やデータのビジネス ロジック操作の前には実行しません。

于 2009-01-16T19:52:32.293 に答える
0

上記のコードは機能しませんでしたが、これは機能します:

$_POST = clean_input($_POST);
$_GET = clean_input($_GET);
$_COOKIE = clean_input($_COOKIE);
$_SESSION = clean_input($_SESSION);

function clean_input($array){
    if(count($array)){
        foreach ($array as $key => $value) {
            $array[$key]=htmlentities($value, ENT_QUOTES, 'UTF-8');
        }
    }
    return $array;
}

ここで何がうまくいかないのかを理解しようとしています。

于 2009-01-16T19:47:07.907 に答える