使用 MySQLi 时如何防止 SQL 注入

Posted

技术标签:

【中文标题】使用 MySQLi 时如何防止 SQL 注入【英文标题】:How to prevent SQL-injection when using MySQLi 【发布时间】:2015-05-04 15:26:01 【问题描述】:

我正在构建一个简单的表单,并希望保护它免受以下 SQL 注入的影响: - 盲注 - 基于布尔值 - 盲注 - 基于 UNION 查询 - 堆叠查询 - 基于错误的注入

我以为我已经确保一切安全,但是当我运行 SQL-map 时,它仍然会利用我的数据库。

<?php

$input = $_GET['input'];

if ($input) 
    $db = mysqli_connect("localhost", "sec", "dubbelgeheim", "bookshop");

// Check connection
    if (mysqli_connect_errno()) 
        echo "Failed to connect to MySQL: " . mysqli_connect_error();
    
    $escaper = real_escape_string($input);
    $statement = $db->prepare("SELECT * FROM productcomment WHERE ProductId = ? LIMIT 1");
    $statement->bind_param("s", $escaper);
    $statement->execute();
    $result = $statement->get_result();
    $statement->close();
    $count = $result->num_rows;
    if ($count > 0) 
        while ($row = $result->fetch_assoc()) 
            echo "Product:" . $row['ProductId'] . "<br>";
            echo "Annotation:" . $row['Comment'] . "<br>";
            echo "TestOK!<br>";
        
     
    else 
        echo 'No record!';
    
    $result->free();
    $db->close();

?>

我是不是忘记了什么?

谁能帮忙?

提前致谢!

【问题讨论】:

我会选择 PDO 而不是 MySQLi。 "it still exploits my database" 你能提供更多细节吗?我在这里看不到任何可以被利用的东西。 单独使用准备好的语句并不能保证不会注入。确保您已将 XSS 漏洞利用考虑在内。 顺便说一句; real_escape_string()isn't a core PHP function。 $city = $mysqli-&gt;real_escape_string($city); 是面向对象的风格 php.net/manual/en/mysqli.real-escape-string.php - 所以,向我们展示这个函数的作用。 @GjertGjersund PDO 只给出 1045 错误.. 【参考方案1】:

您的问题是由您显示mysqli_connect_error() 引起的。这可以用于测试,但不应在生产代码中使用。你也不需要$escaper = real_escape_string($input);

试试这个

/* check connection */
if (mysqli_connect_errno()) 
    file_put_contents('MySQLiErrors.txt',date('[Y-m-d H:i:s]'). mysqli_connect_error()."\r\n", FILE_APPEND); 
    exit();
else
     $statement = $db->prepare("SELECT * FROM productcomment WHERE ProductId = ? LIMIT 1");
     $statement->bind_param("s", $input);



【讨论】:

感谢您的回复,但没有帮助。我仍然可以使用 sqlmap 进入我的数据库 你能看看我最近发布的这个主题吗? ***.com/questions/28850098/…

以上是关于使用 MySQLi 时如何防止 SQL 注入的主要内容,如果未能解决你的问题,请参考以下文章

防止 SQL 注入的 Htaccess 和 Mysqli 方法之间的区别

使用mysli防止sql注入

mysqli_real_escape_string 如何无法阻止 SQL 注入? [复制]

mysqli_real_escape_string 如何无法阻止 SQL 注入? [复制]

防止 SQL 注入 - PDO,mysqli [重复]

我们如何防止 MySQL 的 SQL 注入?