Prepare 语句的正确顺序以防止用户输入的 SQL 注入

Posted

技术标签:

【中文标题】Prepare 语句的正确顺序以防止用户输入的 SQL 注入【英文标题】:Proper Order for Prepare Statements to prevent SQL Injection for User Input 【发布时间】:2014-07-17 22:50:21 【问题描述】:

我有一个接受用户输入的网络应用程序,在这种情况下让某人输入用户名。我正在准备语句让我的系统在管理员自动创建另一个具有相同用户名的用户之前检查是否已经存在用户名。

我一直在阅读一些关于用于动态 Web 应用程序的 PDO 准备语句,但据我所知,没有人说明准备语句的正确顺序

值和变量从用户输入解析到prepare语句的顺序有什么不同吗?

如果“准备”语句可以访问用户输入的输入(用户名)会更有意义

示例 1

第二个输入的用户名变量。似乎准备不知道要使用哪些变量 实际逃逸,因此无法防止 SQL 注入

$query = $general->db->prepare('SELECT * FROM users WHERE username = :username');
$username = array('username' => $_POST['addUserName']);
$query->execute($username);
$usernames_exist = $query->fetchAll();

示例 2

首先输入用户名变量以进行适当的 SQL 准备

$username = array('username' => $_POST['addUserName']);
$query = $general->db->prepare('SELECT * FROM users WHERE username = :username');
$query->execute($username);
$usernames_exist = $query->fetchAll();

有人可以澄清一下哪个顺序首先起作用是否有任何优势,以便正确防止 SQL 注入

【问题讨论】:

示例 1 在我看来根本不起作用。你试过执行吗? @RobertHarvey 你错了。这个问题实际上没有什么意义 其实他们都完美的工作 顺序很重要,只有当你使用 bindParam 和 bindValue 时 @meda:听起来像是对我的回答。 【参考方案1】:

有 2 个代码 sn-ps 在任何一种方式下都基本相等。

但据我所知,没有人说明准备语句的正确顺序

可能是因为顺序根本不重要?

如果“准备”语句可以访问用户输入的输入(用户名)会更有意义

不会的。 prepare() 与用户输入无关。即使您在调用prepare() 之前只创建了一个有序的php 数组,它也不会突然意识到用户输入。

处理用户输入的是execute() /bind functions,您可以在其中传递用户输入。听起来很合乎逻辑,嗯?

关于 SQL 注入预防,您只需要知道每个变量都应该只通过占位符进入查询。只要您能遵循这个简单的规则,您就可以认为自己不会被注入。只要您的代码按预期工作,任何其他事项,无论是运算符的顺序还是空格数,都不会影响任何事情。

【讨论】:

以上是关于Prepare 语句的正确顺序以防止用户输入的 SQL 注入的主要内容,如果未能解决你的问题,请参考以下文章

PHP:使用准备好的语句并防止 SQL 注入与逃逸

多个 If 语句 - 未返回正确的值

mysql prepare疑问

我们应该总是绑定我们的 SQL 语句吗?

在codeigniter中逃避足够的防止sql注入的保护

为什么要参数化执行SQL语句呢?