2008-09-29 82 views

回答

26

存儲程序和/或準備的語句:

https://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks

Can I protect against SQL Injection by escaping single-quote and surrounding user input with single-quotes?

Catching SQL Injection and other Malicious Web Requests

使用Access數據庫,你仍然可以做到這一點,但如果你已經擔心SQL注入,我認爲你無論如何都需要關閉Access。

下面是訪問技術的鏈接:

http://www.asp101.com/samples/storedqueries.asp

注意什麼典型的注射保護不是存儲過程本身,但事實上,它是參數化不是動態的。請記住,即使構建動態代碼的SP如果以特定方式使用參數來構建動態代碼,也可能容易受到注入攻擊。總的來說,我更喜歡SP,因爲它們構成了應用程序到達數據庫的接口層,所以應用程序甚至不允許首先執行任意代碼。

此外,如果您不使用命令和參數(例如,),存儲過程的執行點可能會受到攻擊。這仍然是脆弱的,因爲它是動態生成的,可以是注入目標:

Conn.Execute("EXEC usp_ImOnlySafeIfYouCallMeRight '" + param1 + "', '" + param2 + "'") ; 

記住,你的數據庫需要保衛自己的邊界,如果各種登錄表格有權INSERT/UPDATE/DELETE,在這些應用中的任何代碼(或妥協的應用程序)可能是一個潛在的問題。如果登錄只有執行存儲過程的權限,這就形成了一個漏斗,通過它你可以更容易地確保正確的行爲。 (類似於OO概念,其中對象負責其接口並且不暴露它們的所有內部工作)。

3

使用參數化查詢,您需要創建一個命令對象,爲其分配帶有名稱和值的參數if你這樣做,你就不需要擔心任何東西(指的當然SQL注入;))

http://prepared-statement.blogspot.com/2006/02/asp-prepared-statements.html

而且不信任的存儲過程,它們可以成爲攻擊向量太多,如果你不不使用預先準備的語句。

+0

存儲過程並不是答案(即使他沒有使用Access),因爲你仍然可以使用SP編寫注入代碼(我已經看到它)。它是保護你的參數化查詢。 – Flory 2008-09-29 19:49:15

1

如果存儲過程是不是一種選擇 - 即使他們是 - 驗證所有輸入至少是徹底

-2

切換到SQL Express是一個很好的選擇。它會使事情變得更加安全。儘管使用參數和存儲過程可以幫助很大。我還建議您仔細驗證輸入,以確保它們符合您的期望。

對於像數字這樣的值,提取數字以確認它確實只是一個數字是相當容易的。爲SQL退出所有特殊字符。這樣做可以防止嘗試的攻擊發揮作用。

4

「一個強大的方法來防止傳統的ASP應用程序的SQL注入」是無情地驗證所有輸入。期。

單獨的存儲過程和/或不同的數據庫系統並不一定具有良好的安全性。

MS最近推出了一個SQL注入檢測工具,用於查找查詢中使用的未驗證輸入。這是你應該尋找的。

這裏的鏈接: The Microsoft Source Code Analyzer for SQL Injection tool is available to find SQL injection vulnerabilities in ASP code

1

嘿,因爲誰使用它開發好任何數據庫。

沒有更多,但沒有少。

如果您是一位優秀的開發人員,您可以使用文本文件作爲數據庫來構建電子商務網站。 是的,它不會像甲骨文驅動的網站一樣好,但它對於像家庭,定製珠寶製造這樣的小型企業來說可以做得很好。

如果您是一位優秀的開發人員,您將不會在ASP頁面上使用內聯SQL語句。 即使在Access中,您也可以選擇構建和使用查詢。

存儲數據驗證過程以及html編碼 - 是防止任何SQL注入攻擊的最佳方法。

8

這裏有幾個sqlinject腳本我很久以前做了一個簡單的版本和擴展版本:

function SQLInject(strWords) 
dim badChars, newChars, i 
badChars = array("select", "drop", ";", "--", "insert", "delete", "xp_") 
newChars = strWords 
for i = 0 to uBound(badChars) 
newChars = replace(newChars, badChars(i), "") 
next 
newChars = newChars 
newChars= replace(newChars, "'", "''") 
newChars= replace(newChars, " ", "") 
newChars= replace(newChars, "'", "|") 
newChars= replace(newChars, "|", "''") 
newChars= replace(newChars, "\""", "|") 
newChars= replace(newChars, "|", "''") 
SQLInject=newChars 
end function 


function SQLInject2(strWords) 
dim badChars, newChars, tmpChars, regEx, i 
badChars = array(_ 
"select(.*)(from|with|by){1}", "insert(.*)(into|values){1}", "update(.*)set", "delete(.*)(from|with){1}", _ 
"drop(.*)(from|aggre|role|assem|key|cert|cont|credential|data|endpoint|event|f ulltext|function|index|login|type|schema|procedure|que|remote|role|route|sign| stat|syno|table|trigger|user|view|xml){1}", _ 
"alter(.*)(application|assem|key|author|cert|credential|data|endpoint|fulltext |function|index|login|type|schema|procedure|que|remote|role|route|serv|table|u ser|view|xml){1}", _ 
"xp_", "sp_", "restore\s", "grant\s", "revoke\s", _ 
"dbcc", "dump", "use\s", "set\s", "truncate\s", "backup\s", _ 
"load\s", "save\s", "shutdown", "cast(.*)\(", "convert(.*)\(", "execute\s", _ 
"updatetext", "writetext", "reconfigure", _ 
"/\*", "\*/", ";", "\-\-", "\[", "\]", "char(.*)\(", "nchar(.*)\(") 
newChars = strWords 
for i = 0 to uBound(badChars) 
Set regEx = New RegExp 
regEx.Pattern = badChars(i) 
regEx.IgnoreCase = True 
regEx.Global = True 
newChars = regEx.Replace(newChars, "") 
Set regEx = nothing 
next 
newChars = replace(newChars, "'", "''") 
SqlInject2 = newChars 
end function