我正在构建一个简单的表单,并希望针对以下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();
}
?>
我忘记了什么吗?
有人可以帮忙吗?
提前致谢!
答案 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);
}