除了阻止它的过程之外,我对SQL注入一无所知。
我想知道,如果攻击者会修改我准备好的声明:
$DB = $Con->prepare("SELECT * FROM Test WHERE username=?");
$DB->bind_param('s',$Username);
$DB->execute();
他进入的声明是:
x' DROP TABLE Test
bind / prepared语句如何处理此请求?
会返回错误还是继续?因为bind_param
将特定值链接到所述SQL语句?
答案 0 :(得分:1)
不,数据库只会查找用户名为x' DROP TABLE Test
的记录,因此您最终可能会得到一个空的结果集。
答案 1 :(得分:0)
使用bind_param时,将为您转义值。你仍然应该验证数据,以确保它是正确的,但它是安全的注入
答案 2 :(得分:0)
准备好一份声明后,就会进行预编译。因此,绑定到它的任何参数都将作为原始数据发送,并且绝不能修改SQL语句。
您的示例可以正常工作,它会选择所有使用用户名x' DROP TABLE Test
的行。