0

首先,我完全不确定,但大多数 SQL 注入、XSS 攻击等都是通过 URL 使用 GET 参数发生的。

所以我想知道,如果我可以将它们全部清除并检测是否有非法单词,如果是,则退出到 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

它会返回假。

当我输入此链接时:?section=register&section

它将返回 true,如果我输入除部分之外的任何内容,它将返回 false。为什么这样做?

如您所见,我已经对其进行了调试,这就是它返回的内容:

62 array count:31

所以$count = 62 and array count = 31

为什么会变成62?看起来它的计数器翻了一番。我做错了什么?

4

1 回答 1

3

按照您的逻辑,如果一切正常,检查的实际比较将是:

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

因为计数器正在为每个非法术语的每个 GET 参数递增。

话虽如此,你对这个问题使用的方法几乎不可能是广泛的,更不用说是完整的了。

最好对输入进行清理并使用防止非法值被处理的编程结构(正如 Anigel 提到的,将您想要的内容列入白名单),而不是搜索错误的结构。

于 2013-07-31T15:27:42.343 回答