关于mysql代码何时使用PDO进行注入验证感到困惑

时间:2017-06-12 13:19:30

标签: php mysql pdo sql-injection

我理解mysql语句如何易受攻击的基本思路,但每次我尝试找到有用的指南时,使用PDO实现这一目标的方法看起来都是不同的。另外,我有时会在stackoverflow上告诉我,我的代码很容易受到攻击,例如前几天有关于以下内容的说法(这不适用于btw,但我被教导如何实现它:

$search = $_GET["search"];
$searcharray = explode('|', $search);
$query=("SELECT username,sender,message,subject,timestamp,threadid,msgtype 

FROM Messages WHERE  ('" . implode("'|'",$searcharray) . "') IN CONCAT 
(message,subject)  ORDER BY timestamp");

..但为什么呢?是否还不够:

$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
代码前的

$result = $conn->query($query)->fetchAll(PDO::FETCH_OBJ);

之后?

人们是否自动假设我没有这些部分,因为我只发布与我的问题相关的部分,或者我的SELECT语句的一部分本身是否容易受到攻击? 另外,我是否需要PDO-ify所有mysql语句,所以不仅需要SELECT而且还需要更新UPDATE,INSERT等吗?

提前致谢!

1 个答案:

答案 0 :(得分:5)

您的查询容易受到攻击,因为您直接使用输入发送到服务器而不转义它(例如$ _GET) 您应该使用预备语句绑定您正在使用的变量:

$search = $_GET["search"];
$searcharray = explode('|', $search);
$query=("SELECT username,sender,message,subject,timestamp,threadid,msgtype 

FROM Messages WHERE  :searchParams IN CONCAT 
(message,subject)  ORDER BY timestamp");

$query = $conn->prepare($query);
$query->execute(['searchParams' => implode("'|'",$searcharray)]);

这样,用户输入就会被转义。