Cor*_*art 4 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");
Run Code Online (Sandbox Code Playgroud)
.. 但为什么?是否还不够:
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
Run Code Online (Sandbox Code Playgroud)
在代码和之前
$result = $conn->query($query)->fetchAll(PDO::FETCH_OBJ);
Run Code Online (Sandbox Code Playgroud)
然后?
人们是否自动假设我没有这些部分,因为我只发布与我的问题相关的部分,或者我的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)]);
Run Code Online (Sandbox Code Playgroud)
这样,用户输入就会被转义.
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |