[英]Read HTML Tags from DB without XSS Vulnerabilities
我有一個簡單的注釋部分,我希望可以用它來設置每個注釋的樣式,將文本和html標簽保存在數據庫中。
在大多數情況下,我對將評論數據插入數據庫的方式充滿信心。 當然,如果您有其他感覺,我不反對聽到您的意見。
if(isset($_POST["comment"])) {
$userid = $_SESSION['user_id'];
$comment = $conn->real_escape_string(trim($_POST['comment']));
$sql = "INSERT INTO comments (`user_id`, `comment`, `parent_id`, `type`)
VALUES ('.$userid.', '$comment', '$parent_id', '$type')";
if ($conn->query($sql) === TRUE) {
echo "Thanks for the comment!";
} else {
die("Error commenting" . $conn->error);
}
}
但是,如果我直接通過MySQL並將行更新為簡單的javascript警報,它將呈現並在頁面加載時收到警報。 因此,我在讀取數據時有一個漏洞。
while($row = mysqli_fetch_array($result)) {
$parent_id = $row['parent_id'];
$type = $row['type'];
echo '<h1>'.$row['user_name'].'</h1>';
echo '<p>'.$row['comment'].'</p>';
}
我知道我可以通過strip_tags($row['comment'])
類的東西使它更安全。 但是,如果我這樣做,則注釋上將沒有任何樣式,因為<p>
標簽(以及與此相關的其他標簽)將被剝離。 因此,我的問題是這樣的:如何在允許簡單的html樣式的同時,以防止明顯的XSS漏洞的方式讀取數據(就像您在這些注釋中看到的那樣)。
非常感謝!
首先,您可以在注釋系統中使用無害的bbcode
,但我認為您不太了解strip_tags()
。 strip_tags()
有兩個參數。 第一個是您的字符串,但是第二個是允許使用的標簽(可以通過strip_tags()
傳遞的標簽),因此例如:
<?php
$text = '<p>Test texts.</p><!-- Comment --> <a href="#fragment">and other text</a>';
echo strip_tags($text);
# Allow <p> and <a>
echo strip_tags($text, '<p><a>');
?>
它輸出:
<p>Test texts.</p> <a href="#fragment">and other text</a>
您可以在此處使用strip_tags()
文檔
strip_tags()
有第二個參數,它是一串允許的標簽。
在這種情況下,所有標簽都將被刪除:
$comment = "<script>alert('Hello world');</script>This is <i>a comment</i>.";
$strippedComment = strip_tags($comment);
echo $comment;
這將導致: alert('Hello world');This is a comment.
但是,使用第二個參數,您可以允許使用基本格式標記,如下所示:
$comment = "<script>alert('Hello world');</script>This is <i>a comment</i>.";
$strippedComment = strip_tags($comment, "<i><u><b>");
echo $comment;
現在,結果為: alert('Hello world');This is <i>a comment</i>.
不幸的是,其他的答案是錯誤的:使用strip_tags
是不安全的。
原因?
用戶只需輸入以下代碼即可繞過您的清理工作:
<p onmouseover="alert('This could be evil XSS')">Test texts.</p> <a href="#fragment">and other text</a>
通過strip_tags
<p>
標記的strip_tags
傳遞此代碼不會刪除代碼:
echo strip_tags("<p onmouseover=\"alert('This could be evil XSS')\">Test texts.</p> <a href=\"#fragment\">and other text</a>", "<p>");
因為p
的屬性仍然輸出:
<p onmouseover="alert('This could be evil XSS')">Test texts.</p> and other text
它將運行:
除了通過使用諸如HTML Purifier之類的清理程序使文本對於HTML輸出安全之外,還應該在輸出用戶控制的文本的任何頁面上實施內容安全策略 。 這應該可以有效防止注入的腳本命令運行。
CSP使您可以有效地阻止內聯腳本被瀏覽器執行。 目前,現代瀏覽器(例如Chrome和Firefox) 支持該功能(盡管IE當前僅部分支持)。
這是通過頁面中的HTTP響應標頭完成的。
例如
Content-Security-Policy: script-src 'self' https://apis.google.com
如果用戶設法將嵌入式JavaScript插入到您的頁面中,它將停止執行嵌入式JavaScript(它將被警告忽略),但將允許腳本標記引用您自己的服務器或https://apis.google.com
。 可以根據需要定制您的需求。 不支持CSP的瀏覽器仍然需要HTML清理器,因此您仍然應該首先運行所有用戶提供的輸入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.