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


Proper Order for Prepare Statements to prevent SQL Injection for User Input

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

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

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

如果'prepare'语句能够访问用户输入的input (username),那就更有意义了

示例1

第二个输入的用户名变量。似乎准备不知道什么变量

$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注入

这两个代码片段在任何方面都是基本相等的。

但是据我所知,没有人说明了prepare语句的正确顺序

也许这是因为顺序根本不重要?

如果'prepare'语句能够访问用户输入的input (username),那就更有意义了

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

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

所有你需要知道的关于SQL注入的预防是,每个单独的变量应该只通过占位符进入查询。只要你能遵循这个简单的规则,你就可以认为自己是安全的。任何其他问题,无论是操作符的顺序还是空格的数量,都不会影响任何东西,只要您的代码按预期工作即可。