对 mysql 代码何时使用 PDO 进行注入证明感到困惑

Confused about when mysql code is injection proof using PDO

我了解 mysql 语句如何容易受到攻击的基本思想,但每次我尝试找到有用的指南时,使用 PDO 实现此目的的方法看起来各不相同。另外,有时我在 Whosebug 上被告知我的代码是易受攻击的,例如前几天有人说了以下内容(顺便说一句,这不起作用,但我被教导如何做到这一点:

$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);

之后呢?

人们是否自动假设我没有这些部分,因为我只 post 与我的问题相关的部分,或者我的 SELECT 陈述中是否有一部分本身是脆弱的? 另外,我是否需要 PDO-ify 所有 mysql 语句,所以不仅 SELECT 还需要更新 UPDATE、INSERT 等?

提前致谢!

您的查询容易受到攻击,因为您直接使用输入发送到服务器而没有转义它(例如 $_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)]);

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