使用 str_replace 修复 SQL 注入

Posted

技术标签:

【中文标题】使用 str_replace 修复 SQL 注入【英文标题】:Fixing SQL Injection with str_replace 【发布时间】:2020-04-08 00:00:28 【问题描述】:

我有源代码并尝试替换星号来修补 SQL 注入这里是代码:

$search = str_replace ("*", "", $search);
$rows = mysqli_query ($conn, "SELECT * FROM users WHERE username=/*" . $search . "*/ 'Aaron'", MYSQLI_USE_RESULT); 

变量放在C风格注释MySQL时是否可以利用?

【问题讨论】:

为什么需要这样做?只使用查询参数,不要使用字符串连接。您无需询问是否有任何方法可以利用查询参数。 请参阅***.com/questions/60174/…,了解在 php 中使用查询参数的示例。不过,我不会投票结束您的问题,因为您提出了不同的问题。 【参考方案1】:

首先,如果您担心 SQL 注入,那么您应该过滤来自用户的任何输入并对其进行验证。

最好的保护是使用准备好的语句。像这样:

<?php
/** Open DB-Connection */
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');

$firstname = "John";
$lastname = "Smith";
$email = "info@youremail.com";

/** Your SQL-Statement */
$statement = $pdo->prepare("SELECT * FROM users WHERE firstname = :firstname OR lastname = :lastname OR email = :email");

/** Fills the parameter */
$statement->execute(array('firstname' => $firstname, 'lastname' => $lastname, 'email' => $email));   

?>

您尝试替换* 将不起作用。 C 风格的 cmets 容易受到攻击。例如,如果黑客将“*”作为 UTF 编码符号发送,他可能会发送(编码)以下内容:

(用户名第一行,密码第二行)。

attacker', 1, /*
*/'pwd

【讨论】:

以上是关于使用 str_replace 修复 SQL 注入的主要内容,如果未能解决你的问题,请参考以下文章

sql注入漏洞如何修复

sql注入漏洞如何修复

sql注入漏洞如何修复

13sql注入修复

如何修复SQL注入漏洞

关于ECSHOP中sql注入漏洞修复