我知道使用MySQLi和PDO的好处,但是我想知道清理多项选择列表的最佳方法是以下选项:
首先使用mysql_real_escape_string的显而易见的方法:
$clean_POST = array();
$clean_POST = mysql_real_escape_string($_POST['foo']);
但恶意用户是否有可能通过大量POST值发送并设法阻止服务器?回复here似乎表明这是可能的。
可以通过创建白名单并在其上迭代检查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方法相比,使用这种方法可能会有一个显着的处理时间缺点,特别是在需要同时处理多个字段的情况下?
考虑到安全性和性能,是否可以将一种方法视为优秀?
答案 0 :(得分:2)
在许多编程环境中,性能与安全性是不合适的。最有可能的是,您的输入检查将导致数据库更新或插入查询,这将比您的"复杂的时间长100到1000秒。输入检查。
考虑在1(2,5,20)年的时间内,您或其他人将处理您的代码,不知道为什么或是否已完成某些事情。最佳做法是检查一组允许的条目,否则您将没有下拉列表。此外,在下拉列表的显示和表单提交之间,此值列表可能已更改,因此您需要再次检查它。
所有主要框架都以这种方式检查,所以迟早会得出相同的结论。
答案 1 :(得分:1)
常见的建议是:仅在需要的地方应用消毒,并且仅根据具体情况进行消毒。即:你的所有POST都会成为某些查询的一部分吗?如果没有,那么您将只需要清理那些将在查询中使用的部分。
现在,关于你所假设的劣势 - 确定,它应该是,你应该采取措施。在许多情况下,检查白名单将比应用转义功能更快。在你的具体情况下,最好的方法来衡量。一般情况下,白名单是确保您的字段安全的最强大的工具 - 因为您将确保没有任何东西可以克服它们并进一步传递给您的应用程序。因此,我建议 - 如果您确切知道允许的值集合 - 请将该集合用作白名单。