首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果所有的SQL查询都应该准备好以防止SQL注入,为什么语法允许非准备的查询?

如果所有的SQL查询都应该准备好以防止SQL注入,为什么语法允许非准备的查询?
EN

Stack Overflow用户
提问于 2020-05-05 15:18:09
回答 3查看 134关注 0票数 2

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-05-05 18:59:15

在查询是一个固定字符串且不需要任何程序变量的情况下,使用query()运行它是安全的。

下面是来自https://www.php.net/manual/en/pdo.query.php的示例

代码语言:javascript
复制
<?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表达式中的值,则需要使用参数:

代码语言:javascript
复制
$sql = 'SELECT name, colour, calories FROM fruit
    WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql);
$sth->execute(array('calories' => 150, 'colour' => 'red'));

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

票数 2
EN

Stack Overflow用户

发布于 2020-05-05 15:22:08

即使需要使用准备好的语句,也无法阻止从变量替换中创建准备好的语句。例如。

代码语言:javascript
复制
$sql = "SELECT * FROM someTable WHERE id = $id";
$stmt = $conn->prepare($sql);
票数 1
EN

Stack Overflow用户

发布于 2020-05-05 19:20:18

绑定参数和查询准备是两种不同的东西。你可以做其中一件或另一件或两者。

您需要绑定参数以防止SQL注入。但是,有些东西不能作为参数传递(例如,ORDER ),在这种情况下,您可以将所需的SQL语法直接连接到SQL字符串中。这被称为“动态SQL”,通常应该只使用白色字符串来防止SQL注入。

因此,要回答(我想的是)您的问题:动态SQL是允许的,因为绑定参数没有涵盖一些情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61616604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档