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

时间:2015-03-03 20:03:01

标签: php mysql mysqli sql-injection

我正在构建一个简单的表单,并希望针对以下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();
}
?>

我忘记了什么吗?

有人可以帮忙吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

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


}