如何在使用MySQLi时防止SQL注入


How to prevent SQL-injection when using MySQLi

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

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

<?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();
}
?>

我忘了什么吗?

有人能帮忙吗?

提前感谢!

您的问题是由显示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);

}