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

时间:2014-05-28 15:47:21

标签: php sql pdo prepared-statement sql-injection

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

我一直在对PDO预处理语句进行一些阅读,以便在动态Web应用程序中使用,但就我所见,没有人说明准备语句的正确顺序

从用户输入中将值和变量解析为prepare语句的顺序是否存在差异?

如果'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 个答案:

答案 0 :(得分:0)

两种代码片段在任何一种方式上基本相同。

  

但就我所见,没有人说明准备声明的正确顺序

可能是因为订单根本不重要?

  

如果'prepare'语句可以访问用户输入的输入(用户名)

,那将更有意义

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

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

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