我必须修复一个易受 SQL 注入(inject)攻击的项目。
项目中每个页面的所有表单都没有使用参数化查询,而是简单的字符串查询。
例如 我有搜索页面,查看后面的代码我发现有一个方法 CreateQuery()
可以根据文本字段创建查询例如:
string sQuery = "";
sQuery += "b.name like '%" + txtName.Text + "%'";
然后在 btnSearch_Click()
中我有执行查询的方法:
query = CreateQuery();
var totalList = GetAllBlaBla(query);
我的问题是:
因为我有数百个表单和数千个 formText
和 FIX 的值,是否有一个“快速”的解决方案来实现
- 以某种方式参数化查询或处理情况的全局函数?
- 由于在每个类中查询都是在
SubmitButton_Click()
代码隐藏方法中执行的,我可以处理这里的情况吗,当然是在每个类中? - 我是否应该修改每个表单和表单代码隐藏中的每个条目以参数化 SQL 字符串,这将需要一百万年的时间?
(编辑)编码/解码输入值如何?所以上面的例子将是:
string sQuery = ""; var txt = var txt = HttpUtility.HtmlEncode(txtName.Text); sQuery += "b.name like '%" + txt + "%'";
这可能是一个临时补丁吗?
5-(编辑)这是一个可能的解决方案,还是根本不会改变任何东西?
cmd.Parameters.Add("@txtNameParameter", SqlDbType.VarChar);
cmd.Parameters["@txtNameParameter"].Value = txtName.Text;
sQuery += "b.name like '%" + (string)cmd.Parameters["@txtNameParameter"].Value + "%'";
问题是我必须返回一个字符串,因为处理查询的逻辑是在另一个将字符串作为查询的业务类中定义的,我不能给它一个 CommandType 或 SqlDataAdapter...
建议?
提前致谢。
最佳答案
您已经知道存在问题; IMO,这里的任何“快速”修复都可能减少攻击面,但不太可能阻止确定的滥用;简而言之,列入黑名单确实很难,而且在黑帽网站(以及作为示例,在白帽网站上)有一些非常奇怪输入很容易获得。这些并不总是很容易被识别为辱骂。不是所有的 ' drop table Customers --
;p
无论你做什么,我都会建议你正确地做;参数。 dapper 等工具不过,可能会减少您需要的代码:
sQuery += "b.name like '%'+@text+'%'"
...
conn.Execute(sQuery, new {text=txtName.Text});
(这比手动处理所有参数等更容易)
关于c# - 在大型 asp.net C# web 应用程序中修复 SQL 注入(inject)表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6571298/