在大型asp.net C#Web应用程序中修复SQL注入表单

Att*_*ila 5 c# asp.net sql-injection parameterized-query

我必须修复一个易受SQL注入攻击的项目.

项目中每个页面中的所有表单都不使用参数化查询,而只使用字符串查询.

对于例如我有搜索页,看着后面的代码我看到有一个方法CreateQuery()创建的文本字段作为例如查询筑底:

string sQuery = "";
sQuery += "b.name like '%" + txtName.Text + "%'";
Run Code Online (Sandbox Code Playgroud)

然后在btnSearch_Click()我有查询的方法:

query = CreateQuery();
var totalList = GetAllBlaBla(query);
Run Code Online (Sandbox Code Playgroud)

我的问题是:

由于我有数百种形式和成千上万的formTextFIX价值,因此有一种"快速"的解决方案可以实现

  1. 一个全局函数,用于参数化查询或以某种方式处理情况?
  2. 由于在每个类中查询都是在SubmitButton_Click()代码隐藏方法中执行的,我可以在这里处理这种情况吗?
  3. 我是否应该修改表单代码中的每个表单和每个条目以参数化SQL字符串,这将需要一百万年?
  4. (编辑)编码/解码输入值怎么样?所以上面的例子将是:

    string sQuery = "";
    var txt = var txt = HttpUtility.HtmlEncode(txtName.Text);
    sQuery += "b.name like '%" + txt + "%'";
    
    Run Code Online (Sandbox Code Playgroud)

    这是一个可能的临时补丁吗?

5-(编辑)这是一个可能的解决方案,还是根本不改变任何东西?

        cmd.Parameters.Add("@txtNameParameter", SqlDbType.VarChar);
        cmd.Parameters["@txtNameParameter"].Value = txtName.Text;
        sQuery += "b.name like '%" + (string)cmd.Parameters["@txtNameParameter"].Value + "%'";
Run Code Online (Sandbox Code Playgroud)

问题是我必须返回一个字符串,因为处理查询的逻辑是在另一个将字符串作为查询的业务类中定义的,我不能给它一个CommandType或SqlDataAdapter ...

建议?

提前致谢.

Mar*_*ell 4

你已经知道有问题了;IMO,任何“快速”修复都可能会减少攻击面,但不太可能阻止坚决的滥用;简而言之,列入黑名单确实很难,而且在黑帽(以及白帽示例)网站上可以轻松获得一些非常奇怪的输入。这些并不总是容易被识别为滥用行为。这还不是全部' drop table Customers --;p

无论你做什么,我都建议你正确地做;参数。不过,像dapper这样的工具可能会减少您所需的代码:

sQuery += "b.name like '%'+@text+'%'"
...
conn.Execute(sQuery, new {text=txtName.Text});
Run Code Online (Sandbox Code Playgroud)

(这比手动处理所有参数等更容易)