3

我知道使用 MySQLi 和 PDO 的好处,但是我想知道清理多项选择列表的最佳方法是以下选项:

首先是使用 mysql_real_escape_string 的明显方法:

$clean_POST = array();
$clean_POST = mysql_real_escape_string($_POST['foo']);

但是是否存在恶意用户可以通过大量 POST 值发送并设法阻止服务器的风险?这里的回复似乎表明这是一种可能性。

可以通过创建白名单并对其进行迭代检查 POST 中的完全匹配来缓解此问题:

$_POST['foo'] = array('a', 'b');
$whitelist = array(‘a’, 'b', 'c', 'd');
$clean_POST = array();

if (isset($_POST['foo']))
    {
    foreach ($whitelist as $value)
        {
        if (in_array($value, $_POST['foo']))
            {
            $clean_POST[] = $value;
            }
        }
    }

但是与 mysql-real-escape-string 方法相比,使用这种方法可能存在明显的处理时间劣势,特别是在需要同时处理大量字段的情况下?

考虑到安全性和性能,一种方法可以被认为是优越的吗?

4

2 回答 2

2

在许多编程环境中,性能与安全性是不合适的。您的输入检查很可能会导致数据库更新或插入查询,这将比您的“复杂”输入检查花费 100 到 1000 秒的时间。

考虑一下,在 1 (2,5,20) 年内,您或其他人将在您的代码上工作,不知道为什么或是否做了某事。最佳做法是检查一组允许的条目,否则您将没有下拉列表。此外,在下拉列表的显示和表单提交之间,此值列表可能已更改,因此您需要再次检查它。

所有主要框架都以这种方式进行检查,因此您迟早会得出相同的结论。

于 2013-10-28T08:15:45.180 回答
1

常见的建议是:仅在需要的地方并根据上下文在需要的地方进行消毒。即:您的所有 POST 都会成为某些查询的一部分吗?如果没有,那么您只需要清理那些将在查询中使用的部分。

现在,关于您所谓的劣势-可以肯定的是,您应该采取措施。在很多情况下,检查白名单会比应用转义功能更快。在您的具体情况下,最好的解决方法是测量。一般来说,白名单是保护您的字段的最强大的工具 - 因为您将确保没有任何东西可以克服它们并进一步传递给您的应用程序。因此,我建议 - 如果您确切知道一组有限的允许值 - 将该组用作白名单。

于 2013-10-28T07:24:18.063 回答