可能的SQL注入使用存储过程删除表?

时间:2012-02-11 10:49:03

标签: 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注入?

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

如果可以进行SQL注入,是否有任何方法可以解决这个问题?

2 个答案:

答案 0 :(得分:2)

您只是使用准备好的陈述错误 你必须绑定参数,而不是连接它们。

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 ;

答案 1 :(得分:-1)

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

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

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