给定此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注入到此存储过程中吗?
在调用查询之前,我需要动态构建一个查询(动态where子句)。
如果可以进行SQL注入,有什么方法可以解决这个问题吗?
发布于 2012-02-11 18:56:52
如果您的参数是varchar,并且您发送了一个字符串,那么是的,这是可能的,因为即使您使用PDO,它仍然是一个ANY字符串。
您应该将sdf定义为您的id类型(是整型吗?如果不是,则将其设置为整数!)然后,PDO参数将被转义并避免SQL注入。
一种好的做法是避免在存储过程中创建动态查询,而在应用程序中生成查询。
发布于 2012-02-11 20:01:31
您只是错误地使用了预准备语句。
您必须绑定参数,而不是将它们连接在一起。
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 ;
https://stackoverflow.com/questions/9239599
复制相似问题