Asp.net web api 避免Web API查询字符串参数中的SQL注入

Asp.net web api 避免Web API查询字符串参数中的SQL注入,asp.net-web-api,asp.net-web-api2,.net-4.5,sql-injection,Asp.net Web Api,Asp.net Web Api2,.net 4.5,Sql Injection,我们有一个ASP.NET Web API控制器,它从查询字符串中接受以逗号分隔的数据库列名字符串。检查此列名字符串,以确保字符串中仅包含字母字符、下划线和逗号;不允许使用空格、特殊字符或数字。该字符串最终通过字符串插值添加到SQL语句中,就像在查询字符串中传递给API一样 任何其他查询字符串参数都将作为参数添加到SQL语句中。我们在参数化列表时遇到了一个问题,Oracle无法正确解释列,因此我们最终采用了此解决方案 虽然不是很理想,但是否有其他步骤可以通过此向量防止SQL注入攻击 我们目前正在使

我们有一个ASP.NET Web API控制器,它从查询字符串中接受以逗号分隔的数据库列名字符串。检查此列名字符串,以确保字符串中仅包含字母字符、下划线和逗号;不允许使用空格、特殊字符或数字。该字符串最终通过字符串插值添加到SQL语句中,就像在查询字符串中传递给API一样

任何其他查询字符串参数都将作为参数添加到SQL语句中。我们在参数化列表时遇到了一个问题,Oracle无法正确解释列,因此我们最终采用了此解决方案

虽然不是很理想,但是否有其他步骤可以通过此向量防止SQL注入攻击


我们目前正在使用Dapper进行数据访问,但经常使用普通ADO.NET。

如果这是您唯一可以做的事情,只要您确保不允许使用数字和特殊字符(如引号、相等和不同),您就可以了。我甚至会说你应该对数字很在行,我见过一些情况,数字实际上被用作列名的一部分,所以你可以稍微放松一下限制

基本上,你可以创建一个允许的字符的白名单,当请求进来时,如果任何字符不在该名单中,你可以抛出错误的请求并立即停止。白名单比黑名单好得多,因为白名单可以短得多,而且更容易维护

另一层保护可以来自API本身。确保您:

  • 验证对控制器的访问,不允许匿名用户,如果可以的话,可以使用类似OAUTH2的方式
  • 将该API调用转换为POST,并发送请求主体中而不是查询字符串中的列列表
  • 通过HTTPs发出请求

  • 所有这些都应该让您得到很好的保护,因为现在没有人可以看到您发送的内容,如果您正确保护您的端点,他们也无法发出请求。

    使用OData和实体框架库。若使用OData将列和实体框架扩展为数据库访问,那个么就不可能进行SQL注入。