我有一个接受用户输入的网络应用程序,在这种情况下,有人输入用户名。在管理员自动创建具有相同用户名的其他用户之前,我正准备让系统检查是否已有用户名。
我一直在对PDO预处理语句进行一些阅读,以便在动态Web应用程序中使用,但就我所见,没有人说明准备语句的正确顺序
从用户输入中将值和变量解析为prepare语句的顺序是否存在差异?
如果'prepare'语句可以访问用户输入的输入(用户名)
,那将更有意义用户名变量输入秒。看起来像准备不会知道什么变量 实际上是逃避,因此无法防止SQL注入
$query = $general->db->prepare('SELECT * FROM users WHERE username = :username');
$username = array('username' => $_POST['addUserName']);
$query->execute($username);
$usernames_exist = $query->fetchAll();
首先输入用户名变量以进行正确的SQL准备
$username = array('username' => $_POST['addUserName']);
$query = $general->db->prepare('SELECT * FROM users WHERE username = :username');
$query->execute($username);
$usernames_exist = $query->fetchAll();
有人可以澄清首先是否有任何优势,以便正确防止SQL注入
答案 0 :(得分:0)
两种代码片段在任何一种方式上基本相同。
但就我所见,没有人说明准备声明的正确顺序
可能是因为订单根本不重要?
如果'prepare'语句可以访问用户输入的输入(用户名)
,那将更有意义
不会。 prepare()
与用户输入无关。即使你在调用prepare()
之前创建了只有序数的PHP数组,它也不会突然意识到用户输入。
用户输入的内容是execute()
/ bind functions
,您可以在其中传递用户输入。听起来很合乎逻辑,嗯?
所有你需要了解的SQL注入预防是每个变量只能通过占位符进行查询。只要你能遵循这个简单的规则,你就可以认为自己不会注入。只要您的代码按预期工作,任何其他事项,无论是运算符的顺序还是空格的数量,都不会产生任何影响。