2011-03-17 81 views
23

如果我正在清理我的數據庫插入,並且還轉義了我用htmlentities($text, ENT_COMPAT, 'UTF-8')寫的HTML - 是否有任何要用xss_clean過濾輸入的要點?它給了什麼其他好處?CodeIgniter - 爲什麼使用xss_clean

+0

'ヶ輛($文本,ENT_COMPAT, 'UTF-8')'不停止XSS的,任何人都不應使用此的好方法。 – rook 2011-03-18 05:55:38

+5

'htmlentities'完全可以抵抗HTML注入,但如果您使用單引號屬性分隔符,則需要'ENT_QUOTES'而不是'ENT_COMPAT'。 'htmlspecialchars'通常比'htmlentities'更受歡迎,不過,因爲它更不容易搞亂字符集。 CodeIgniter的'xss_clean'是一個毫無價值的貨物 - 邪教編程災難區,充滿了關於字符串處理的錯誤理解。 – bobince 2011-08-20 10:32:52

回答

37

xss_clean()是廣泛的,也愚蠢。這個函數的90%不會阻止xss。如查找alert這個詞,但不是document.cookie。沒有黑客會在他們的利用中使用alert,他們將用xss劫持cookie或讀取CSRF令牌來製作XHR。

但是運行htmlentities()htmlspecialchars()它是多餘的。其中xss_clean()修復問題和htmlentities($text, ENT_COMPAT, 'UTF-8')失敗的情況如下:

<?php 
print "<img src='$var'>"; 
?> 

一個簡單的POC是:

http://localhost/xss.php?var=http://domain/some_image.gif「%20onload =警報(/ XSS /)

這會將onload=事件處理程序添加到圖像標記。停止這種形式的xss的方法是htmlspecialchars($var,ENT_QUOTES);或在這種情況下xss_clean()也會阻止這種情況。

然而,從xss_clean()文檔引用:

,沒有什麼是100%萬無一失, 當然,但我一直沒能得到任何 通過過濾器。

話雖這麼說,XSS是一種output probleminput problem。例如,該函數不能考慮變量已經在<script>標籤或事件處理程序中。它也不會阻止基於DOM的XSS。您需要考慮如何使用數據以便使用最佳功能。過濾輸入中的所有數據是不良練習。這不僅不安全,而且還會破壞可能會使比較困難的數據。

+0

謝謝。我想重要的一點是,「你在做什麼數據」。當我想到的工作是一個可編輯的文本塊,我根本不需要任何活動的HTML標籤,所以我的解決方案在這種情況下工作。輸出被轉儲到一個DIV中,並且所有的HTML標記都被編碼了,我看不出有什麼惡意可能被插入。當然,如果我想在輸入中允許一些會使事情複雜化的HTML。 儘管如此,我並不太滿意在輸入上對所有內容進行編碼的想法,但我寧願在輸出時根據需要處理它(同時保護數據庫)。 – 2011-03-18 11:39:56

+0

@丹Searle如果你想要一個安全的HTML子集,那麼你應該簽出htmlpurifier.org – rook 2011-03-18 12:12:36

+4

XSS *是一個輸出問題,而不是輸入問題,這就是爲什麼像'xss_clean()'可以*永遠不會*是解決XSS問題的可靠方法(和'xss_clean()'本身,即使是低XSS標準的反XSS工具也是可怕的實施)。我感到非常驚訝,你似乎認爲它是第一句話中輸出級轉義的替代選擇。 – bobince 2011-08-20 10:35:11

3

是的,你仍然應該使用它,我至少在公開輸入,這意味着任何人都可以訪問和提交的任何輸入使用它。

通常爲數據庫查詢清理輸入似乎是一個副作用,因爲該函數的真正目的是防止Cross-site Scripting Attacks

我不打算進入xss_clean每一步需要的細節,但我會告訴你它的確比您提到的幾個步驟更多,我已經pastied the source of the xss_clean function所以你可以看看你自己,它是完全的評論說。

3

我會推薦使用http://htmlpurifier.org/進行XSS純化。我正在努力擴展我的CodeIgniter輸入類以開始利用它。

+0

你能夠擴展CI爲htmlpurifier? – 2015-04-15 11:55:32

+1

對不起,我早就搬到了Laravel。 :) – Anthony 2015-04-16 14:29:03

+0

https://github.com/refringe/codeigniter-htmlpurifier – qwertzman 2016-10-05 01:56:50

6

在你的情況下,"stricter methods are fine, and lighter weight"。 CodeIgniter開發人員將xss_clean()用於不同的用例,「一個允許'安全'HTML標籤的評論系統或論壇。這從文檔中不清楚,其中xss_clean顯示應用於用戶名字段。

還有另外一個原因是從來沒有使用xss_clean(),它迄今尚未在stackoverflow上突出顯示。在20112012期間xss_clean()被破壞,並且不可能完全修復。至少沒有完全重新設計,沒有發生。 At the moment, it's still vulnerable to strings like this:

<a href="j&#x26;#x41;vascript:alert%252831337%2529">Hello</a> 

當前實現xss_clean的()開始通過有效地施加urldecode()和html_entity_decode()到整個字符串。這是必要的,所以它可以使用一個天真的檢查像「javascript:」的東西。最後,它返回解碼後的字符串

攻擊者可以簡單地對他們的漏洞利用進行兩次編碼。它將被xss_clean()解碼一次,並以乾淨的方式傳遞。然後你就有了一個單獨編碼的漏洞,準備在瀏覽器中執行。

我把這些檢查稱爲「天真」,因爲它們在很大程度上依賴於正則表達式而無法修復。 HTML不是一種常規語言。 You need a more powerful parser to match the one in the browser; xss_clean()沒有這樣的東西。也許可以將HTML的一個子集列入白名單,這些子集可以用正則表達式乾淨利落地排列。但是,當前的xss_clean()非常黑名單。

1

如果您希望篩選器在每次遇到POST或COOKIE數據時自動運行,您可以通過打開application/config/config.php文件並將其設置爲: $ config ['global_xss_filtering'] = TRUE;

你可以通過打開你的application/config/config.php文件來啓用csrf保護並設置: $ config ['csrf_protection'] = TRUE;

欲瞭解更多詳情,請參閱以下鏈接。

https://ellislab.com/codeigniter/user-guide/libraries/security.html

相關問題