2010-06-09 79 views
1

針對SQL注入缺陷的典型控件是使用綁定變量(cfqueryparam標籤),驗證字符串數據並轉向實際SQL層的存儲過程。這一切都很好,我同意,但是,如果該網站是一個遺留的網站,它具有很多動態查詢功能。然後,重寫所有查詢是一項艱鉅的任務,需要進行大量的迴歸和性能測試。我正在考慮使用動態SQL過濾器並在調用cfquery之前調用它來執行實際操作。針對動態查詢的SQL注入保護

我發現CFLib.org一個過濾器(http://www.cflib.org/udf/sqlSafe):

<cfscript> 
/** 
* Cleans string of potential sql injection. 
* 
* @param string  String to modify. (Required) 
* @return Returns a string. 
* @author Bryan Murphy ([email protected]) 
* @version 1, May 26, 2005 
*/ 
function metaguardSQLSafe(string) { 
var sqlList = "-- ,'"; 
var replacementList = "#chr(38)##chr(35)##chr(52)##chr(53)##chr(59)##chr(38)##chr(35)##chr(52)##chr(53)##chr(59)# , #chr(38)##chr(35)##chr(51)##chr(57)##chr(59)#"; 

return trim(replaceList(string , sqlList , replacementList)); 
} 
</cfscript> 

這似乎是一個非常簡單的過濾器,我想知道是否有辦法改進它,或者拿出一個解決方案更好

回答

9

如果這個網站是一個遺留網站,並且它具有很多動態查詢功能。 然後,重寫所有的查詢是一個 艱鉅的任務,它需要一個 迴歸和 性能測試。

沒錯,但這樣的話,如果你執行任何顯著的變化,包括使用像你提出的一個功能。

因此,我仍然建議獲取一些測試設置,重構使用合理的框架,然後修復查詢以使用cfqueryparam。

說的具體功能是一堆廢話,這不做什麼它聲稱要做,並有打破的東西(不正確地由超過最大長度)的潛力。

它只是將--轉換成&#45;&#45;'轉換成&#39; - 這不是SQL注入保護!

所以是的,如果你仍然想沿着這條路線走,找到一個不同的功能,但我建議適當的重構。

+0

你是絕對正確的。我的觀點是,重構數百個使用cfqueryparam的查詢涉及更長的測試周期,而不是重新連接現有的函數以利用中央函數在執行前清理輸入。那麼,你可以說在一天結束的時候,這仍然涉及到嚴格的測試,這是事實,但至少它是集中包含的。 你碰巧知道一個很好的開源功能(理想情況下在CF中)完成這項工作嗎? – user164701 2010-06-09 14:24:26

3

很明顯,你有很多工作要做。但是,當你捲起袖子時,爲減輕注入攻擊造成的一些潛在損害,你可能會做的一件小事是創建幾個數據源,並通過僅限於select語句的數據源運行所有的select查詢。並且對於所有數據源,請確保諸如grant,revoke,create,alterdrop被禁用。

0

您可以試試Portcullis。這是一個開源的CFC,您可以使用它來掃描SQL Injection和XSS攻擊的URL,FORM和COOKIE範圍。它不能保證保護,但至少在今天提供一些保護,在你重寫查詢時不費吹灰之力。好處是它可以包含在Application.cfm/cfc中,以約4行代碼爲代價掃描每個CF頁面請求的範圍。