如果我正在清理我的數據庫插入,並且還轉義了我用htmlentities($text, ENT_COMPAT, 'UTF-8')
寫的HTML - 是否有任何要用xss_clean過濾輸入的要點?它給了什麼其他好處?CodeIgniter - 爲什麼使用xss_clean
回答
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 problem
不的input problem
。例如,該函數不能考慮變量已經在<script>
標籤或事件處理程序中。它也不會阻止基於DOM的XSS。您需要考慮如何使用數據以便使用最佳功能。過濾輸入中的所有數據是不良練習。這不僅不安全,而且還會破壞可能會使比較困難的數據。
謝謝。我想重要的一點是,「你在做什麼數據」。當我想到的工作是一個可編輯的文本塊,我根本不需要任何活動的HTML標籤,所以我的解決方案在這種情況下工作。輸出被轉儲到一個DIV中,並且所有的HTML標記都被編碼了,我看不出有什麼惡意可能被插入。當然,如果我想在輸入中允許一些會使事情複雜化的HTML。 儘管如此,我並不太滿意在輸入上對所有內容進行編碼的想法,但我寧願在輸出時根據需要處理它(同時保護數據庫)。 – 2011-03-18 11:39:56
@丹Searle如果你想要一個安全的HTML子集,那麼你應該簽出htmlpurifier.org – rook 2011-03-18 12:12:36
XSS *是一個輸出問題,而不是輸入問題,這就是爲什麼像'xss_clean()'可以*永遠不會*是解決XSS問題的可靠方法(和'xss_clean()'本身,即使是低XSS標準的反XSS工具也是可怕的實施)。我感到非常驚訝,你似乎認爲它是第一句話中輸出級轉義的替代選擇。 – bobince 2011-08-20 10:35:11
是的,你仍然應該使用它,我至少在公開輸入,這意味着任何人都可以訪問和提交的任何輸入使用它。
通常爲數據庫查詢清理輸入似乎是一個副作用,因爲該函數的真正目的是防止Cross-site Scripting Attacks。
我不打算進入xss_clean每一步需要的細節,但我會告訴你它的確比您提到的幾個步驟更多,我已經pastied the source of the xss_clean function所以你可以看看你自己,它是完全的評論說。
我會推薦使用http://htmlpurifier.org/進行XSS純化。我正在努力擴展我的CodeIgniter輸入類以開始利用它。
在你的情況下,"stricter methods are fine, and lighter weight"。 CodeIgniter開發人員將xss_clean()用於不同的用例,「一個允許'安全'HTML標籤的評論系統或論壇。這從文檔中不清楚,其中xss_clean顯示應用於用戶名字段。
還有另外一個原因是從來沒有使用xss_clean(),它迄今尚未在stackoverflow上突出顯示。在2011和2012期間xss_clean()被破壞,並且不可能完全修復。至少沒有完全重新設計,沒有發生。 At the moment, it's still vulnerable to strings like this:
<a href="j&#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()非常黑名單。
如果您希望篩選器在每次遇到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
- 1. Codeigniter php標籤剝離與xss_clean
- 2. CodeIgniter:如何在庫中使用安全類的xss_clean函數?
- 3. XSS_CLEAN不笨
- 4. Codeigniter使用什麼設計模式?
- 5. Codeigniter:刪除index.php只能使用較少的uri段。爲什麼?
- 6. 爲什麼mod_rewrite規則不能在CodeIgniter中使用?
- 7. 爲什麼使用codeigniter的列表不顯示所有記錄?
- 8. 使用codeigniter - 爲什麼歐洲字符不能正確顯示?
- 9. 爲什麼CodeIgniter不傳遞變量?
- 10. 爲什麼CodeIgniter分頁鏈接膨脹?
- 11. Codeigniter:Userdata - 何時/爲什麼/如何使用
- 12. Zend&CodeIgniter有什麼區別
- 13. 什麼是codeigniter中的routes.php
- 14. codeigniter中的db_clean是什麼?
- 15. 什麼是驗證信用卡codeigniter
- 16. CodeIgniter會話中的user_data用於什麼?
- 17. Kohana的框架,使用安全:xss_clean的驗證過濾器
- 18. CodeIgniter PHPWord使用作爲third_party
- 19. 爲什麼我的AJAX .post在Codeigniter中不起作用?
- 20. 爲什麼不在我調用函數時加載視圖? codeigniter
- 21. 爲什麼這個jQuery在Codeigniter中不起作用?
- 22. 爲什麼Access-Control-Allow-Origin在Codeigniter Rest-Server中不起作用
- 23. 爲什麼發送電子郵件在codeigniter中不起作用?
- 24. Codeigniter - 爲什麼加入購物車不起作用?
- 25. CodeIgniter分頁 - 第一頁的鏈接不起作用,爲什麼?
- 26. 爲什麼CodeIgniter應用程序文件在public_html文件夾中?
- 27. 爲什麼在項目中使用'assert'? (爲什麼使用它這麼多次)
- 28. 爲什麼使用CRTP
- 29. 爲什麼不使用PHP?
- 30. 爲什麼使用IEventDispatcher.hasListener()?
'ヶ輛($文本,ENT_COMPAT, 'UTF-8')'不停止XSS的,任何人都不應使用此的好方法。 – rook 2011-03-18 05:55:38
'htmlentities'完全可以抵抗HTML注入,但如果您使用單引號屬性分隔符,則需要'ENT_QUOTES'而不是'ENT_COMPAT'。 'htmlspecialchars'通常比'htmlentities'更受歡迎,不過,因爲它更不容易搞亂字符集。 CodeIgniter的'xss_clean'是一個毫無價值的貨物 - 邪教編程災難區,充滿了關於字符串處理的錯誤理解。 – bobince 2011-08-20 10:32:52