我有一个在SSL中运行的ASP.NET页面,检查发生在代码隐藏中。
我已完成以下操作以阻止sql注入:
包含RegEx以过滤掉不必要/危险的字符(基本上,它现在只允许0-9,a-z和A-Z)。
使用看起来像“SELECT * FROM table WHERE username = @Username ...”的查询。
我还添加了帐户锁定功能,因此您只能进行有限的尝试。
在IBM AppScan测试漏洞之后,似乎我只修复了盲SQL注入而不是Authenticated Bypass。
是否有任何我错过的导致我未通过漏洞测试的内容?
更新:
...
bool bUser = FilterInput(txtUsername.Text);
bool bPass = FilterInput(txtPassword.Text);
// check for restricted characters
if (bUser && bPass)
Response.Redirect("Login.aspx");
...
public static bool FilterInput(string text)
{
// check if string contains only letters and numbers
return (Regex.IsMatch(text, @"^[a-zA-Z0-9]+$"));
}
任何不在a-zA-Z0-9字符内的内容都应该抛出'false'并导致页面重定向/刷新登录页面。
数据库查询都使用参数化查询,登录正常。这个部分没问题。
答案 0 :(得分:1)
删除你做的第一件事,然后使用SqlCommand.Parameters
,如下所述:
SQL Injection vs. Lethal Injection / Protection Against SQL Injection
我总是使用多个连接字符串来访问数据库,每个人都有不同的角色:阅读,撰写,执行即可。当你这样做时,你确保如果在读取操作上成功进行攻击,攻击者除了阅读之外不能做其他事情(这仍然不好但比修改更好)
答案 1 :(得分:0)
显然,代码上有2个数据库查询未更新为参数化查询。
参数化查询足以阻止SQL注入,因此其他步骤/功能有点过分。