在使用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 中拼接未經處理的數據<br> 直接輸出數據庫字段的值是非常危險的,必須經過適當處理
在實際項目中,養成對輸出到瀏覽器的所有數據進行轉義的習慣是安全開發的基本要求。結合mysqli_result的查詢結果和htmlspecialchars() ,我們可以有效防止大部分XSS 攻擊,保障網站和用戶的安全。
如果你有需要進一步優化的部分,比如封裝輸出函數或使用模板引擎,我也可以幫你整理。你想要我寫個更完整的封裝示例嗎?
相關標籤:
HTML