我在许多源代码中看到,开发人员在ex的用户输入变量上使用大括号:-
query("SELECT * FROM users WHERE email = '{$email}' AND password = '{$password}'");我看到人们创建了两个文件(可能有一些原因),一个是使用以下查询:retrieve.php
query("SELECT * FROM users WHERE email = $email AND password = $password");
和其他带有此查询的文件:retrieve_safely.php (注意到文件名)
query("SELECT * FROM users WHERE email = '{$email}' AND password = '{$password}'");
这让我产生了疑问,这两者之间有什么区别呢?查询中大括号的确切用途是什么?它们是否用于防止SQL注入?如果是的话,那又如何呢?
发布于 2022-03-03 06:38:55
TL;DR:不,IT不会阻止SQL注入
大括号是将变量的内容注入字符串的一种方法。参考资料:https://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.double
因此,这两个命令做的事情完全一样:
query("SELECT * FROM users WHERE email = $email AND password = $password");
query("SELECT * FROM users WHERE email = {$email} AND password = {$password}");如果是一样的,那为什么还要用花括号呢?因为它是将对象的属性/数据成员注入字符串的一种方法:
query("SELECT * FROM users WHERE email = {$user->email} AND password = {$user->password}");通过读取文件名retrieve.php和retrieve_safely.php,_safely文件中的变量有一个引号。
所以,,除非在retrieve_safely.php中的代码之前有某种输入清除,否则该文件并不比retrieve.php更安全
https://stackoverflow.com/questions/71332933
复制相似问题