0

まず、よくわかりませんが、SQL インジェクションや XSS 攻撃などのほとんどは、GET パラメータを使用して URL 経由で発生します。

それで、それらをすべてきれいにして、違法な単語があるかどうかを検出できたらどうなるだろうかと思いました。もしそうなら、404ページに出ます。

これが私の機能です:

    private static function cleanPath()
    {
        if (isset($_GET))
        {
            $count      = 0;
            $illegal    = array 
            (
                '<?', '<?php', '?>', '(', ')',
                '{', '}', 'SELECT', '*', 'FROM',
                'WHERE', 'select', 'from', 'where',
                'DELETE', 'delete', 'echo', 'print',
                'html', 'div', 'class', 'function',
                'prepare', 'query', 'execute', 'exec_',
                '_', '++', 'bindvalue', 'static',
                '$'
            );

            foreach ($illegal as $i)
            {
                foreach ($_GET as $key => $value)
                {
                    $check = strpos($key, $i);
                    if (!$check)
                    {
                        $count++;
                    }
                }
            }

            if ((int)$count == count($illegal))
            {
                return true;
            }
            else
            {
                echo $count . ' array count:' . count($illegal) . '<br />';
                return false;
            }
        }
    }

しかし、機能が正しく動作していないようです。

そして、私はこのリンクを入力します:?section=register&sec

false を返します。

このリンクを入力すると:?section=register&section

true を返し、section 以外を入力すると false を返します。なぜそれをしているのですか?

ご覧のとおり、私はすでにそれをデバッグしており、それが返されます:

62 array count:31

そう$count = 62 and array count = 31

なぜ62になるのですか?カウンター倍増のようです。私は何を間違えましたか?

4

1 に答える 1

3

あなたの論理によれば、すべてが問題なければ、チェックする実際の比較は次のようになります。

if ((int)$count == (count($_GET) * count($illegal)))

不正な用語ごとに GET パラメータごとにカウンタがインクリメントされるためです。

そうは言っても、この問題に使用するアプローチは、完全であることは言うまでもなく、広範であることさえほとんど不可能です。

入力をサニタイズし、違法な値が処理されるのを防ぐプログラミング構造を使用する方が良いです (アニゲルが述べたように、必要なものをホワイトリストに登録する)。

于 2013-07-31T15:27:42.343 に答える