2009-01-02 89 views

回答

3

這裏的問題的一部分是,你想允許某些種類的HTML,對吧?鏈接例如。但是,您只需清理那些可能包含腳本標記等XSS攻擊的HTML標記,或者甚至事件處理程序屬性或以「javascript:」開頭的其他屬性。因此,對於您的問題的完整答案需要比「替換特殊字符」更復雜,因爲這不允許鏈接。

防止SQL注入可能在某種程度上取決於您的平臺選擇。我的首選Web平臺有一個內置語法,用於參數化查詢,這些查詢主要防止SQL注入(稱爲cfqueryparam)。如果您使用的是PHP和MySQL,則有一個類似的本地mysql_escape()函數。 (我不確定PHP函數技術上是否創建了參數化查詢,但是迄今爲止,它在防止SQL注入嘗試方面效果很好,因爲我已經看到了一些安全存儲在db中的嘗試。)

On XSS保護,我曾經使用正則表達式來爲這種原因消毒輸入,但是由於既允許鏈接之類的東西同時也去除了危險的代碼,因此已經遠離該方法。我已經選擇的是XSLT。同樣,執行XSL轉換的方式可能會因您的平臺而異。前一段時間,我寫了an article for the ColdFusion Developer's Journal關於如何執行此操作,其中包括您可以使用的boilerplate XSL sheet以及如何使用本機XmlTransform()函數使其與CF一起工作。

我選擇遷移到XSLT的原因有兩個。

首先驗證輸入是格式良好的XML,消除了使用某些字符串拼接技巧的XSS攻擊的可能性。

其次,使用XSL和XPath選擇器處理XHTML數據包比使用正則表達式更容易,因爲它們專門用於處理結構化XML文檔,與設計用於原始字符串操作的正則表達式相比。所以它更簡潔,更容易出錯,如果我發現我犯了一個錯誤,修復起來就更容易。

另外,當我測試它們時,我發現CKEditor(他刪除了F)等所見即所得編輯器保留了格式良好的XML,所以你不應該擔心這是一個潛在的問題。

1

爲防止SQL注入攻擊,您可以做的最好的事情是確保在進行數據庫調用時使用參數化查詢或存儲過程。通常情況下,我也建議您進行一些基本的輸入消毒,但由於您需要接受來自用戶的代碼,因此這可能不是一種選擇。

在另一端(呈現的用戶輸入到瀏覽器時),編碼數據的HTML將導致任何惡意的JavaScript或類似爲呈現作爲文本而不是在客戶端的瀏覽器執行。任何體面的Web應用程序服務器框架都應具有這種能力

0

我想說一個人可以取代所有< & lt;等(例如使用PHP上的htmlentities),然後選擇帶有某種白名單的安全標籤。問題是白名單可能有點太嚴格。

這裏是一個PHP例子

$code = getTheCodeSnippet(); 
$code = htmlentities($code); 
$code = str_ireplace("&lt;br&gt;", "<br>", $code); //example to whitelist <br> tags 
//One could also use Regular expressions for these tags 

爲了防止SQL注入,你可以「由‘innofensive’等價和\字符,如\」全部替換和\,使下面的C線

#include <stdio.h>//'); Some SQL command-- 

在數據庫中沒有任何負面結果。

2

相同的規則適用於保護:過濾器輸入,轉義輸出。

在包含代碼的輸入的情況下,過濾就意味着該字符串必須包含可打印的字符,並且可能有長度限制。

將文本存儲到數據庫時,可以使用查詢參數,也可以轉義字符串以確保沒有可以創建SQL注入漏洞的字符。代碼可能包含更多符號和非字母字符,但是您必須注意的有關SQL注入的內容與普通文本相同。

不要試圖複製正確的轉義函數。大多數數據庫庫都包含一個函數,可以對所有需要轉義的字符進行正確轉義(例如,這可能是特定於數據庫的轉義)。它還應該處理字符集的特殊問題。只需使用庫提供的功能即可。

我不明白爲什麼人們說「使用存儲過程!」存儲過程對SQL注入沒有特別的保護。如果將未轉義的值插入到SQL字符串中並執行結果,則這容易受到SQL注入的影響。無論你是在應用程序代碼中還是在存儲過程中執行它都沒關係。

輸出到Web演示文稿時,就像使用任何文本一樣,轉義HTML特殊字符。

+0

存儲過程的漏洞可能在某種程度上取決於平臺的選擇。作爲一個例子,ColdFusion有一個cfstoredproc標籤,它使用爲目標數據庫提供的庫在內部處理所有必要的轉義,從而避免在該平臺上注入。 – 2009-01-02 20:21:24