使用 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 注入的主要内容,如果未能解决你的问题,请参考以下文章