php - 使用 MySQLi 时如何防止 SQL 注入(inject)

标签 php mysql mysqli sql-injection

我正在构建一个简单的表单,并希望确保其免受以下 SQL 注入(inject)的影响: - 盲注 - 基于 bool 值 - 盲注 - 基于 UNION 查询 - 堆叠查询 - 基于错误的注入(inject)

我以为我已经保证了一切安全,但是当我运行 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();
}
?>

我是不是忘记了什么?

有人可以帮忙吗?

提前致谢!

最佳答案

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


}

关于php - 使用 MySQLi 时如何防止 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28840932/

相关文章:

php - 如何使用php搜索从起点到交货地点

php - 无法用字符串中的 &pound 替换 £

php - 未找到 Amazon EMR 流式映射器/缩减器

php - 查询无法正确保存日期

php - 如果数据存在,防止将数据插入数据库

php - 限制textarea中的字符 - 转义引号和双引号在MySQL中占用2个字符

php - 带有 between 子句的 mysqli 准备语句

php - Jquery 无法将变量传递给 php

php - 在 mysqli 中处理小数

php - 在 MySQLi 和 PHP 中使用数组