簡體   English   中英

在插入數據庫而不是輸出之前逃避HTML是一個壞主意嗎?

[英]Is it a bad idea to escape HTML before inserting into a database instead of upon output?

我一直在研究一個不允許HTML格式化的系統。 我目前使用的方法是在HTML實體插入數據庫之前將其轉義。 我被告知我應該將原始文本插入數據庫,並在輸出時轉義HTML實體。

我在這里看到的其他類似問題看起來像HTML仍然可以用於格式化的情況,所以我要求的情況是根本不會使用HTML。

是的,因為在某個階段您需要訪問輸入的原始輸入。 這是因為...

  • 你永遠不知道你想如何顯示它 - 用JSON,HTML,作為短信?
  • 可能需要按原樣將其顯示給用戶。

我確實看到了你從不想輸入HTML的觀點。 你還用什么去剝離HTML標簽? 如果它是正則表達式,那么請留意可能輸入類似內容的混淆用戶...

3<4 :->

如果是正則表達式,他們只會得到3

在插入數據庫之前執行轉義時,您也會限制自己。 假設您決定不使用HTML作為輸出,而是使用JSON,純文本等。

如果你已經在你的數據庫中存儲了轉義的html,你首先必須'unescape'存儲在數據庫中的值,只是為了再次將它重新轉換為不同的格式。

還看到了關於xss預防的完美owasp文章

  1. 另一個難以捉摸的問題:假設您輸入的是帶有字符串R&B的記錄。 它將存儲為R&amp;B 並假設我們有一個使用SQL的搜索功能:

     $query = $database->prepare('SELECT * FROM table WHERE title LIKE ?'); $query->execute(array($searchString.'%')); 

    現在,如果有人搜索R&B ,它將與該行不匹配,因為它存儲為R&amp;B 平等,排序等情況相同。

    當然,這里我們遇到的問題是不搜索HTML標簽,因為當有人搜索span時, <span>會匹配。 這可以通過將搜索功能委托給像Solr這樣的外部服務來解決,或者通過將版本存儲在第二個字段中來解決,該字段清除了HTML標簽,特殊字符等(用於全文搜索),類似於@limscoder建議的內容。

  2. 有一天,您可能會通過API或其他方式公開您的數據,並且您的API用戶可能會認為它是未轉義的。

  3. 幾個月后,一個新的團隊成員加入。 作為一個訓練有素的開發人員,他總是使用html轉義,現在只是為了看到所有內容都被雙重轉義(例如,有些標題出現像He said &quot;nuff&quot;而不是He said "nuff" )。

  4. htmlspecialchars()引用樣式(例如ENT_QUOTESENT_COMPAT等)會咬你,如果你使用的是默認值之外的任何東西,並且忘記在存儲/輸出中使用相同的引用樣式。

    當你使用htmlentities()來存儲,並使用htmlspecialchars()來輸出時,會發生類似的問題,反之亦然(使用相應的反函數)。 您的HTML將被&Uuml;污染&Uuml; s, &Ccedil;

    如果有多個開發人員在相同的代碼庫上工作,則更容易被濫用。

我通常存儲兩個版本的文本。 在進行正常頁面請求時使用轉義/格式化文本以避免每次轉義/格式化的開銷。 當用戶需要編輯現有條目時使用原始/原始文本,並且僅在創建或更改文本時發生轉義/格式化。 除非您有嚴格的存儲空間限制,否則此策略很有效,因為您將復制數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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