mysql - 如果应该准备所有 SQL 查询以防止 SQL 注入,为什么语法允许非准备查询?
问题描述
既然所有的 SQL 查询都应该准备好防止 SQL 注入,为什么我们允许编写和执行非准备好的查询呢?这看起来不违反直觉吗?
解决方案
在查询是固定字符串并且不需要任何程序变量的情况下,使用query()
它来运行它是安全的。
这是来自https://www.php.net/manual/en/pdo.query.php的示例:
<?php
$sql = 'SELECT name, color, calories FROM fruit ORDER BY name';
foreach ($conn->query($sql) as $row) {
print $row['name'] . "\t";
print $row['color'] . "\t";
print $row['calories'] . "\n";
}
查询中没有 PHP 变量。就足够了,并且与和query()
完成相同。prepare()
execute()
如果您需要将 PHP 变量替换为 SQL 表达式中的值,则可以使用参数:
$sql = 'SELECT name, colour, calories FROM fruit
WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql);
$sth->execute(array('calories' => 150, 'colour' => 'red'));
您可能会发现这在您的应用程序中比运行固定查询更常见。
推荐阅读
- mysql - 如何解决 MySQL 中的更新锁定问题
- zurb-foundation - 在 ZURB Foundation 6 中,有没有办法让列围绕隐藏列流动?
- nlp - 文本语义预处理
- python - 你如何找到一个字符串在列表中连续重复的最大数量?
- qt - qt抱怨2套二进制文件
- python-3.x - Mac OS X 上的 ODBC Sql Server 17 驱动程序
- python - 在pyexcel中更改Book对象中工作表的默认顺序
- apache-nifi - Apache NIFI ExecuteStreamCommand
- swift - SCNNode 未锚定在现实世界坐标中
- python - Q-learning 算法奖励生成