在使用 PHP 和 MySQLi 执行数据库查询并输出数据到 HTML 页面时,我们必须小心避免 XSS(跨站脚本攻击)漏洞。这类漏洞通常出现在直接把数据库中的内容输出到网页而没有进行任何转义或过滤的情况下。
为了安全地输出内容,htmlspecialchars() 是一个非常有用的工具。它会将 HTML 特殊字符(如 <, >, &, " 等)转换成 HTML 实体,这样就能防止恶意脚本被注入到页面中。结合 mysqli_result 对象获取数据库查询结果,我们可以安全地显示内容。
下面是一个具体的示例,展示如何使用 mysqli_result 配合 htmlspecialchars():
<?php
// 数据库连接
$mysqli = new mysqli("localhost", "username", "password", "database");
// 检查连接
if ($mysqli->connect_errno) {
die("连接失败: " . $mysqli->connect_error);
}
// 执行查询
$sql = "SELECT id, title, content FROM articles";
$result = $mysqli->query($sql);
if ($result && $result->num_rows > 0) {
echo "<h1>文章列表</h1>";
echo "<ul>";
while ($row = $result->fetch_assoc()) {
// 使用 htmlspecialchars 转义输出
$title = htmlspecialchars($row['title'], ENT_QUOTES, 'UTF-8');
$content = htmlspecialchars($row['content'], ENT_QUOTES, 'UTF-8');
// 假设文章有一个详情链接
$articleUrl = "https://m66.net/article.php?id=" . urlencode($row['id']);
echo "<li>";
echo "<a href=\"$articleUrl\">$title</a><br>";
echo "<p>$content</p>";
echo "</li>";
}
echo "</ul>";
} else {
echo "没有找到文章。";
}
// 关闭连接
$mysqli->close();
?>
ENT_QUOTES 参数确保单引号和双引号都被转义。
'UTF-8' 指定字符编码,避免编码引起的绕过问题。
构造 URL 时使用 urlencode()
如果 URL 中需要插入参数,务必使用 urlencode() 进行编码,防止特殊字符破坏 URL 结构。
不要直接在 HTML 中拼接未经处理的数据
直接输出数据库字段的值是非常危险的,必须经过适当处理。
在实际项目中,养成对输出到浏览器的所有数据进行转义的习惯是安全开发的基本要求。结合 mysqli_result 的查询结果和 htmlspecialchars(),我们可以有效防止大部分 XSS 攻击,保障网站和用户的安全。
如果你有需要进一步优化的部分,比如封装输出函数或使用模板引擎,我也可以帮你整理。你想要我写个更完整的封装示例吗?