【发布时间】:2015-11-23 22:00:12
【问题描述】:
我只是没有找到任何我喜欢的答案。
我想做这样的事情:
public class TestSqlInjectionController : ApiController
{
public IEnumerable<TestSqlInjectionUser> Get([ValidateSqlInjection]string usernameFilter = null)
{
如果传入过滤器包含;、--、DROP 或DELETE,[ValidateSqlInjection] 会查找基本信息,例如抛出错误。
所以我会有一个可维护的列表。
然后创建一个自定义属性:
[FilterField1ValidateSqlInjection]
这里可能会将一个逗号分隔的列表拆分成一个数组。
然后遍历数组并确保每个元素与枚举中的一个值匹配。
这听起来像是在朝着正确的方向前进吗?
问题是我们必须使用动态 SQL 进行大量的分页、排序和过滤。没有其他办法了。
所以命令参数对我们来说并没有什么作用。
对于任何有 .Net SQL 注入经验的人来说,自定义属性听起来是个好主意吗?
【问题讨论】:
-
这是一种经典的黑名单方法 - 这是有缺陷的,因为注射器非常巧妙......每次添加另一个关键字或一组字符进行检查时,那些讨厌的攻击者已经准备好了 10 个攻击者——这是一场无望的上坡战斗。所以真的,你应该要么使用适当的技术,比如带有参数化查询的常规 SQL(我认为这是迄今为止首选的方法 - 它可以轻松处理分页、排序、过滤 - 相信我! ),或者您应该使用带有有效关键字列表的 白名单 方法
-
你应该寻找user input escaping
-
usernameFilter应该包含什么?为什么不接受字符串集合而不是单个字符串?
标签: c# .net asp.net-web-api sql-injection