我理解mysql语句如何易受攻击的基本思想,但是每次我试图找到有用的指南时,使用PDO实现这一目标的方法看起来彼此不同。此外,我有时会在 stackoverflow 被告知我的代码很脆弱,例如前几天有人说以下内容(顺便说一句,这不起作用,但我被教导如何做到这一点:
$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等?
提前感谢!
您的查询容易受到攻击,因为您直接使用输入发送到服务器而不对其进行转义(例如 $_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)]);
这样,用户输入就会被转义。