对mysql代码何时使用PDO进行注入证明感到困惑
Posted
技术标签:
【中文标题】对mysql代码何时使用PDO进行注入证明感到困惑【英文标题】:Confused about when mysql code is injection proof using PDO 【发布时间】:2017-11-13 23:50:29 【问题描述】:我了解 mysql 语句如何易受攻击的基本概念,但每次我尝试找到有用的指南时,使用 PDO 实现此目的的方法看起来都各不相同。另外,有时我在 *** 上被告知我的代码很容易受到攻击,例如前几天有人说以下内容(顺便说一句,这不起作用,但我被教导如何做到这一点:
$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 语句的一部分本身就是易受攻击的? 另外,我是否需要对所有 mysql 语句进行 PDO 化,所以不仅需要更新 SELECT,还需要更新 UPDATE、INSERT 等?
提前致谢!
【问题讨论】:
仅仅构建字符串并将它们发送到 PDO 是不够的,授予的大部分保护来自使用带有绑定变量的准备好的语句 -- this popular q/a 为您提供了一些很好的信息。 谢谢 A C,我去看看! 如果我为您的页面提供了?search=');%20DROP%20TABLE%20Messages;%20--
,您的脚本会很乐意将其发送到数据库。
【参考方案1】:
您的查询很容易受到攻击,因为您直接使用输入发送到服务器而不转义它(例如 $_GET) 您应该使用prepared statements并绑定您正在使用的变量:
$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)]);
这样,用户输入就被转义了。
【讨论】:
谢谢,但它真的应该是“WHERE :searchParams”吗? searchParams 在此之前没有定义。 没关系,:searchParams 只是一个占位符,执行查询时会被替换。以上是关于对mysql代码何时使用PDO进行注入证明感到困惑的主要内容,如果未能解决你的问题,请参考以下文章
对 python 装饰器感到困惑。何时/如何称呼他们? [复制]