1.GPC/RUNTIME魔術引號
- magic_quotes_gpc負責對GET,POST,COOKIE的值進行過濾。
|
- magic_quotes_runtime對從數據庫或者文件中獲取的數據進行過濾。
|
通常在開啓這兩個選項之後能防住部分SQL注入漏洞被利用,因爲我們之前也介紹了,在某些環境下存在繞過,在INT型注入上是沒有多大作用的。
通常數據污染有兩種方式。
- 一種是應用被動接受參數,類似於GET,POST等。
|
- 還有一種是主動獲取參數,類似於讀取遠程頁面或者文件內容等。所以防止SQL注入的方法就是要守住這兩條路。
|
2.過濾函數和類
在PHP5.4之前,可以利用魔術引號來解決部分SQL注入的問題。而GPC在面對INT型注入時,也無法進行很好的防禦。所以在通常的工作場景中,用得多的還是過濾函數和類。不過如果單純的過濾函數寫得不夠嚴謹,也會出現繞過的情況。這時候可以使用預編譯語句來綁定變量,一般情況下這是防禦SQL注入的最佳方式。
常用過濾函數:
3.設計輸入驗證和處理策略
輸入驗證是一種在保護應用程序安全方面很有用的工具。不過,他只能作爲深度防禦策略(包含多個防護層以保護應用程序的總體安全)的一個子部分。
- 在應用程序輸入層使用白名單輸入驗證以便驗證所有用戶輸入都符合應用要接收的內容。應用只允許接收符合期望格式的輸入
|
- 在客戶端瀏覽器上同樣執行白名單輸入驗證,這樣可以防止爲用戶輸入不可接收的數據時服務器和瀏覽器的往返傳遞。不能將該操作作爲安全控制手段,因爲攻擊者可以修改來自用戶瀏覽器的所有數據。
|
- 在Web應用防火牆(WAF)層使用黑名單和白名單輸入驗證(以漏洞“簽名”和“有經驗”行爲的形式)以便提供入侵檢測/阻止功能和監控應用攻擊。
|
- 在應用程序中自始自終地使用參數化語句以保證執行安全地SQL執行。
|
- 在使用從數據庫中提取數據之前恰當地對其進行編碼。例如將瀏覽器中顯示的數據針對跨站腳本進行編碼。
|
- 在應用程序中自始自終地使用參數化語句以保證執行安全地SQL執行
|
4.其他防護方案
領域驅動的安全性
- SQL注入之所以發生,是因爲我們的應用程序不正確地將數據在不同表示方式之間進行映射。
|
- 通過將數據封裝到有效值對象中,並限制對原始數據的訪問,我們就可以控制對數據的使用。
|
編碼輸出
- 確保對包含用戶可控制輸入的查詢進行正確的編碼以防止使用單引號或其他字符來修改查詢。
|
- 如果正在使用LIKE子句,請確保LIKE中的通配符恰當編碼。
|
- 在使用從數據庫接收到的數據之前確保已經對數據中的敏感內容進行了恰當的輸入驗證和輸出編碼。
|