Php 可能的SQL注入删除带有存储过程的表?

Php 可能的SQL注入删除带有存储过程的表?,php,mysql,sql,sql-injection,Php,Mysql,Sql,Sql Injection,给定以下MySQL存储过程: CREATE PROCEDURE customer.`getCustomers5`( sdf varchar(1000) ) BEGIN set @se = concat('select * from customer.customertbl where id=', sdf); PREPARE stm1 from @se; EXECUTE stm1; END; 即使调用此存储过程的前端使用PDO参数/数据绑定,也可以将SQL注入此存储过程吗 在调用查

给定以下MySQL存储过程:

CREATE PROCEDURE customer.`getCustomers5`(
sdf varchar(1000)
)
BEGIN

set @se  = concat('select * from customer.customertbl where id=', sdf);


PREPARE stm1 from @se;

EXECUTE  stm1;

END;
即使调用此存储过程的前端使用PDO参数/数据绑定,也可以将SQL注入此存储过程吗

在调用查询之前,我需要动态地构建一个查询(dynamicwhere子句)


如果可以进行SQL注入,有什么方法可以解决这个问题吗?

如果您的参数是varchar,并且您发送了一个字符串,那么是的,这是可能的,因为即使您使用PDO,它仍然是一个任意字符串

您应该将sdf定义为您的id类型(是整数吗?如果不是,则将其设为整数!),然后将对PDO参数进行转义并避免SQL注入


一个好的做法是避免在存储过程中创建动态查询,并在应用程序中生成查询。

您只是使用了错误的准备语句。
您必须绑定参数,而不是连接它们

DELIMITER // 
CREATE PROCEDURE customer.`getCustomers5`(sdf varchar(1000)) 
BEGIN 
  PREPARE stm1 from 'select * from customer.customertbl where id=?'; 
  SET @a = sdf;
  EXECUTE stm1 using @a; 
END//
DELIMITER ;

. 简言之,使用PDO,您应该是安全的。aa和@SergeyBenner您似乎没有理解这个问题。-1问一个模糊的问题,结果是“不,我不是说,代码完全不同”。在您的示例代码中,如果您这样做,则创建过程客户。GetCustomer5
(sdf varchar(1000))开始从customer.customertbl中选择*,其中id=sdf;结束不可能进行SQL注入。但是,是的,动态查询需要参数化,否则SP本身无法提供任何sql注入保护。是的,Id是整数,我只是在测试限制。另一个问题是,如果涉及到许多sql语句,那么在存储过程或应用程序级别合并会更好吗?存储过程可以。但是您必须注意所有的锁/锁等待等等。如果您要执行许多SQL语句来计算单个结果,最好合并到存储过程中。这样应用程序就不需要进行多次查询,也不需要将数据保存在本地以便进一步处理。因此,尝试创建尽可能复杂的查询,以便在数据库服务器上进行所有计算,您可以将它们放在存储过程中,以便于访问/维护。您仍然应该避免在存储过程中创建动态查询,可以添加更多参数或创建更多过程来匹配每个场景。好的,我想我将在应用程序级别创建所有动态查询,并使用参数绑定对它们进行绑定。。除此之外,它将转到SP。它是什么意思,“PDO参数将被转义”?如果id是字符串类型呢?我想做的SQL语句是动态的,参数的数量是不确定的。在这种情况下,set@a方法不起作用。我想我仍然需要构建SQL@应用程序级别。对不起,伙计,但是你的评论看起来毫无意义。set@a方法使用的是stm变量,它显然根本不是动态语句。如果您需要动态创建SQL—没问题。使用占位符而不是值创建准备好的SQL。没什么大不了的。你唯一需要的就是学习和倾听。