嘿,我正在对涉及一些用户输入的 MySQL 数据库进行一些查询。我想知道如何防止注入(inject)攻击,例如,如果有人输入
"; a-MySQL query here;"
它将被执行,这将允许人们访问危害我的系统。我想知道如何防止这样的事情,可能创建一个函数来过滤掉寻找不良语句的查询?或者也许不允许;特点?
总结一下:
- 现在防止注入(inject)攻击的常见做法是什么?
- 我该怎么办?
- 对于那些知道自己通过更改我的数据库所做的事情的人来说,此解决方案的效果如何。
最佳答案
唯一的方法是正确转义用户提交的数据。其他人指出了一些这样做的方法。
还有另一种方法:准备好的语句和占位符。每个现代 PHP 数据库接口(interface)都支持准备好的语句,包括 mysqli和 PDO .
让我们使用 PDO 作为演示。假设我们想要更新用户提交的表 foo
中的一些数据。
$sql = 'UPDATE foo SET bar = ? WHERE user_id = ?';
$sh = $db->prepare($sql);
$sh->execute(array( $_POST['bar'], $_SESSION['user_id'] ));
传递给execute
的数组中的变量替换查询中的问号占位符。发生这种情况时,它们会自动转义并被引用。您不需要手动转义它们以使它们安全地放入数据库!
另一方面,您仍然需要过滤它们以查找意外内容,例如 HTML、Javascript、您期望数字的字母等。让数据安全地插入数据库是 only half of the battle .
关于php - 在 PHP 中过滤掉 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3340533/