Php 使用绑定/准备语句时的SQL注入?

Php 使用绑定/准备语句时的SQL注入?,php,mysqli,bind,sql-injection,Php,Mysqli,Bind,Sql Injection,除了阻止SQL注入的过程之外,我对SQL注入一无所知 我想知道,攻击者是否会从以下位置修改我准备的语句: $DB = $Con->prepare("SELECT * FROM Test WHERE username=?"); $DB->bind_param('s',$Username); $DB->execute(); 他的陈述是: x' DROP TABLE Test bind/prepared语句将如何处理此请求 它会返回错误还是继续?因为bind_参数将特定值链接

除了阻止SQL注入的过程之外,我对SQL注入一无所知

我想知道,攻击者是否会从以下位置修改我准备的语句:

$DB = $Con->prepare("SELECT * FROM Test WHERE username=?");

$DB->bind_param('s',$Username);

$DB->execute();
他的陈述是:

x' DROP TABLE Test
bind/prepared语句将如何处理此请求


它会返回错误还是继续?因为
bind_参数
将特定值链接到所述SQL语句

使用bind_param时,将为您转义这些值。您仍然应该验证数据以确保其正确性,但它不会被注入。

否,数据库只需查找用户名为
x'的记录DROP TABLE Test
,因此您可能会得到一个空的结果集。

一旦您准备了一条语句,它就会被预编译。因此,绑定到它的任何参数都将作为原始数据发送,并且无法修改SQL语句


您的示例将很好地工作,它将选择所有具有用户名的行,并进行下拉表测试

为什么不自己尝试呢?因此准备好的语句是100%安全的?就SQL注入而言,是的,它们是安全的。只要您绑定参数并且没有将它们与查询连接在一起,您就是安全的。那么准备好的语句是100%安全的吗?从来没有100%安全的。看看XSS,它不是数据库注入,所以不会删除表,而是另一种注入。长话短说,您不必转义您的输入,但您仍应研究在不同阶段应实现的其他安全性so prepared statements是100%安全的?就列的值而言,是的,但如果您想使用变量作为字段名,prepared statements(或转义)是没有用的,您必须使用一个允许使用的名称的白名单。