首页 > 解决方案 > 如果应该准备所有 SQL 查询以防止 SQL 注入,为什么语法允许非准备查询?

问题描述

既然所有的 SQL 查询都应该准备好防止 SQL 注入,为什么我们允许编写和执行非准备好的查询呢?这看起来不违反直觉吗?

标签: mysqlsqlsql-injection

解决方案


在查询是固定字符串并且不需要任何程序变量的情况下,使用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'));

您可能会发现这在您的应用程序中比运行固定查询更常见。


推荐阅读