我理解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等吗?
提前致谢!
答案 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)]);
这样,用户输入就会被转义。