使用 MySQLi 时如何防止 SQL 注入
Posted
技术标签:
【中文标题】使用 MySQLi 时如何防止 SQL 注入【英文标题】:How to prevent SQL-injection when using MySQLi 【发布时间】:2015-05-04 15:26:01 【问题描述】:我正在构建一个简单的表单,并希望保护它免受以下 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();
?>
我是不是忘记了什么?
谁能帮忙?
提前致谢!
【问题讨论】:
我会选择 PDO 而不是 MySQLi。"it still exploits my database"
你能提供更多细节吗?我在这里看不到任何可以被利用的东西。
单独使用准备好的语句并不能保证不会注入。确保您已将 XSS 漏洞利用考虑在内。
顺便说一句; real_escape_string()
isn't a core PHP function。 $city = $mysqli->real_escape_string($city);
是面向对象的风格 php.net/manual/en/mysqli.real-escape-string.php - 所以,向我们展示这个函数的作用。
@GjertGjersund PDO 只给出 1045 错误..
【参考方案1】:
您的问题是由您显示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);
【讨论】:
感谢您的回复,但没有帮助。我仍然可以使用 sqlmap 进入我的数据库 你能看看我最近发布的这个主题吗? ***.com/questions/28850098/…以上是关于使用 MySQLi 时如何防止 SQL 注入的主要内容,如果未能解决你的问题,请参考以下文章
防止 SQL 注入的 Htaccess 和 Mysqli 方法之间的区别
mysqli_real_escape_string 如何无法阻止 SQL 注入? [复制]