簡體   English   中英

從數據庫讀取HTML標記,而沒有XSS漏洞

[英]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>.

http://php.net/strip_tags

不幸的是,其他的答案是錯誤的:使用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

它將運行:

XSS正在運行

除了通過使用諸如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM