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