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

标签 php mysql

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

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

最佳答案

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

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

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

关于php - 清理多项选择列表的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19628972/

相关文章:

Mysql 在间隔内每天只选择一行

php - 在 PHPUnit 测试中找不到 Slim/Http/Environment

php - 在mysql数据库中存储排名

php - 使用 PHP 运行 Shell 脚本

php - 从 mysql 中的两个不同表中选择总计但得到不同的答案

MySQL IN 子句与数组问题

mysql - 从四个表中进行 SQL 查询

php - 如何将后端数据从 PHP(My SQL) 导入到 vuejs 应用程序中

php - 存储在数组中并插入不同的字段名称

java - 使用 SAX 解析器解析 XML 数据并将其保存到 mysql localhost (JAVA) 的速度慢