避免Web API查询字符串参数中的SQL注入

时间:2018-04-25 17:15:20

标签: asp.net-web-api asp.net-web-api2 .net-4.5 sql-injection

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

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

虽然不理想,是否有任何额外的步骤来阻止通过此向量的SQL注入攻击?

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

1 个答案:

答案 0 :(得分:1)

如果这是你唯一可以做的事情,只要你确定你不允许数字和特殊字符如引号,等于和不同你就可以了。我甚至会说你应该对数字很好,我已经看到数字实际上被用作列名的一部分的情况,所以你可以稍微放松一下这个限制。

您基本上可以创建一个允许的白色字符列表,当请求进入时,如果任何字符不属于该列表,那么您可以抛出错误请求并在那里停止。白名单比黑名单要好得多,因为它可以更短,更容易维护。

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

  1. 验证对您的控制器的访问权限,不允许匿名用户,如果可以,可能会像OAUTH2那样。
  2. 将该API调用转换为POST,并在请求正文中发送不在查询字符串中的列列表。
  3. 通过HTTP发出请求。
  4. 所有这些事情应该能够让您受到良好的保护,因为现在没有人可以观看并查看您发送的内容,如果您正确保护您的终端,他们也无法发出请求。