清理多项选择列表的最佳方法


Best way to sanitize a multiple choice select list

我知道使用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方法相比,使用这种方法可能存在明显的处理时间劣势,特别是在需要并发处理许多字段的情况下?

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

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

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

所有主要的框架都以这种方式检查,所以迟早你会得出同样的结论。

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

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