避免SQL Server中的盲SQL注入漏洞的最佳实践 - ASP.Net

HaB*_*aBo 4 asp.net sql-injection

什么是避免SQL注入的最佳实践.

我在我的应用程序上运行了McAfee Secure Check,它显示了SQL Server中的盲SQL注入漏洞问题

建议如下

修复这种脆弱性的唯一方法是识别每个表格参数的可接受输入和拒绝输入那些不符合标准的输入.以下是可接受的解决方案,但它不是最佳的.在包括URL参数的数据输入字段上实现内容解析.从任何用户或动态数据库输入中删除以下字符:( VBScript中的示例)'(转义单引号)input = replace(输入,"'","''")"(双引号)input = replace(输入, """",""))(右括号)input = replace(input,")","")((左括号)input = replace(输入,"(","");(分号) input = replace(input,";","") - (破折号)input = replace(输入," - ","")|(管道)input = replace(输入,"|","")关于文本输入建议在用户提供的输入周围附加引号.

如果我理解正确的建议,我必须找到我的应用程序中的所有表单并验证它不接受任何特殊字符,如 " ' ( ) *

这还有什么吗?

如何确保我的应用程序不容易进行SQL注入

编辑


更多规格:

    Protocol https Port 443 Read Timeout30000Method POST
Path /Login
Hea
ders
Referer=https%3A%2F%2Fwww.mydomain.org%2FLogin
Content-Type=application%2Fx-www-form-urlencoded
Body
ctl00_ScriptManager1_HiddenField=0
__EVENTTARGET=0
__EVENTARGUMENT=0
__VIEWSTATE=/wEPDwUJNjc2MTk0ODk1D2QWAmYPZBYCAgMPZBYCAgsPZBYCAgUPFgIeBFRleHQ
FNzxhIGhyZWY9Jy9SZWdpc3RyYXRpb24nIGNsYXNzPSdidXR0b24nPlJlZ2lzdGVyIE5vdzwvYT5kZEMqo
HfESjF9a2aAo6EwUZFLyVY43k2Ywc5HOrQBdZqz
__EVENTVALIDATION=/wEWCgLkzYaLDgKV/vKYDgKBuZWrDQKS/tSgCgLJloD/DALrw4jECgKb/IYvAu2
GxZoEAuemgo8LAoyWmLsKGesm2g0zKeoodCDHz6Mm9GhhkuncAqXhHTAcUjL1R1Y=
ctl00$header1$btnDisclaimerHTMLOK=OK
ctl00$header1$btnDisclaimerHTMLCancel=Cancel
ctl00$header1$btnSubmit=Register
ctl00$cc1$txtEmail=x' wAiTfOr dELay '0:0:20'--
ctl00$cc1$txtPassword=0
ctl00$cc1$cmdLogin=Log In
Protocol https Port 443 Read Timeout30000Method POST
Path /login/
Hea
ders
Referer=https%3A%2F%2Fwww.mydomain.org%2Flogin%2F
Content-Type=application%2Fx-www-form-urlencoded
Body
ctl00_ScriptManager1_HiddenField=0
__EVENTTARGET=0
__EVENTARGUMENT=0
__VIEWSTATE=/wEPDwUJNjc2MTk0ODk1D2QWAmYPZBYCAgMPZBYCAgsPZBYCAgUPFgIeBFRleHQ
FNzxhIGhyZWY9Jy9SZWdpc3RyYXRpb24nIGNsYXNzPSdidXR0b24nPlJlZ2lzdGVyIE5vdzwvYT5kZEMqo
HfESjF9a2aAo6EwUZFLyVY43k2Ywc5HOrQBdZqz
__EVENTVALIDATION=/wEWCgLkzYaLDgKV/vKYDgKBuZWrDQKS/tSgCgLJloD/DALrw4jECgKb/IYvAu2
GxZoEAuemgo8LAoyWmLsKGesm2g0zKeoodCDHz6Mm9GhhkuncAqXhHTAcUjL1R1Y=
ctl00$header1$btnDisclaimerHTMLOK=OK
ctl00$header1$btnDisclaimerHTMLCancel=Cancel
ctl00$header1$btnSubmit=Register
ctl00$cc1$txtEmail=x' wAiTfOr dELay '0:0:20'--
ctl00$cc1$txtPassword=0
ctl00$cc1$cmdLogin=Log In
Run Code Online (Sandbox Code Playgroud)

我不明白McAfee在这里发现了什么问题.因为对于用户登录我使用参数化存储过程.用户输入在客户端验证

Ica*_*rus 5

最佳做法是始终参数化您的查询; 也就是说,将它们转换成类似的东西:

update your_table 
set cola=@param1, 
colb =@param2
Run Code Online (Sandbox Code Playgroud)

例如,在C#上执行此操作的方式是:

using ( ...)
{
  comm = new  SqlCommand("update your_table set cola=@param1, colb=@param2",conn);
  comm.Parameters.AddWithValue("@param1",someValue);
  comm.Parameters.AddWithValue("@param2",someOtherValue);
  comm.ExecuteNonQuery();
} 
Run Code Online (Sandbox Code Playgroud)


Red*_*ter 2

这是个坏建议。这是一项艰苦的工作,容易出错,而且很可能会遭遇回归失败。最好的方法是仅允许通过参数化查询访问数据。

然后,无论用户输入如何,您都不会受到 SQL 注入的攻击。