【问题标题】:Fixing SQL Injection with str_replace使用 str_replace 修复 SQL 注入
【发布时间】: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时是否可以利用?

【问题讨论】:

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

标签: sql security sql-injection


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多