避免SQL注入的最佳做法是什么。
我在我的应用程序上运行了McAfee Secure Check, 它显示了一个问题 SQL Server中的盲SQL注入漏洞
,建议如下
确保这种脆弱性的唯一方法是识别每个表格的可接受输入 参数和拒绝输入不符合标准。 以下是可接受的解决方案,但它不是最佳的。 在包括URL参数的数据输入字段上实现内容解析。 从任何用户或动态数据库输入中删除以下字符:( VBScript中的示例) '(转义单引号)input = replace(输入,“'”,“''”)“(双引号)input = replace(输入,”“”“,”“))(右括号) input = replace(input,“)”,“”)((左括号)input = replace(输入,“(”,“”);(分号)input = replace(input,“;”,“”) - (破折号)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
我不明白迈克菲在这里发现了什么问题。 因为对于用户登录我使用参数化存储过程。和用户输入在客户端验证
答案 0 :(得分:5)
最佳做法是始终参数化您的查询;也就是说,将它们转换成类似的东西:
update your_table
set cola=@param1,
colb =@param2
例如,在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();
}
答案 1 :(得分:1)
这是不好的建议。这是艰苦的,容易出错,并且可能遭受回归失败。最好的方法是只允许通过paremeterized查询进行数据访问。
然后, 无论用户输入 ,您都不会受到SQL注入攻击。
答案 2 :(得分:0)
实际上,通过Web应用程序确保您不会受到SQL注入攻击的更安全和可审计的方法是确保您的Web应用程序无权执行任何动态slq。
如果您设置了存储过程,并且仅授予您网站执行这些存储过程的权限,那么您几乎可以保证安全,当然,前提是您的存储过程不会做任何有趣的事情。