C# 如何防止.Net Web API动态sql中的sql注入?

C# 如何防止.Net Web API动态sql中的sql注入?,c#,.net,asp.net-web-api,sql-injection,C#,.net,Asp.net Web Api,Sql Injection,我只是没有找到我喜欢的答案 我想做一些类似的事情: public class TestSqlInjectionController : ApiController { public IEnumerable<TestSqlInjectionUser> Get([ValidateSqlInjection]string usernameFilter = null) { 这里可以将逗号分隔的列表拆分为数组 然后遍历数组,确保每个元素与枚举中的一个值匹配 这听起来像是朝着正确

我只是没有找到我喜欢的答案

我想做一些类似的事情:

public class TestSqlInjectionController : ApiController
{
    public IEnumerable<TestSqlInjectionUser> Get([ValidateSqlInjection]string usernameFilter = null)
    {
这里可以将逗号分隔的列表拆分为数组

然后遍历数组,确保每个元素与枚举中的一个值匹配

这听起来像是朝着正确的方向走吗

问题是我们必须使用动态SQL进行大量的分页、排序和过滤。这是没有办法的

所以命令参数对我们来说并没有多大作用


对于有.Net SQL注入经验的人来说,自定义属性听起来是个好主意吗?

有很多解决方案可用。下面是一些来自谷歌的顶级搜索结果

但是,处理SQL注入的最佳选择是不使用动态SQL。现在有更好的工具可供您使用。有参数化的SQL语句和存储过程。但是,如果您的查询必须是动态的,那么我建议您考虑使用LINQ和表达式树。

为了完全安全和动态,您需要编写一个正确解析过滤器字符串的解析器,但我建议您使用动态Linq库,使用库方法,您的客户机代码实际上可以从动态构建的lambda表达式中运行EF查询,这些lambda表达式本身就是库方法通过解析用户输入字符串构造的。此方法生成只能在ORDER BY、WHERE或SELECT子句中使用的安全查询部分

以下是指向此类库的链接:

此库的某些文档:

最好的选择是使用SQL参数,但由于这对您来说还不够,我会尝试使用类似SQL executor的模式

相反,您尝试用一个属性来修饰所有可能的输入,创建一个helper类,该类负责执行所有动态查询,并在执行方法测试内部(如果它有任何SQL注入模式)。您可以使用正则表达式执行此操作,并在发现异常时抛出异常


在UI上,您可以捕获此异常并向用户显示一些输出。

面向方面是您的解决方案。 改变项目太痛苦了。 找到一个好的解析器,检查输入字符串是否有奇怪的行为,如果发现可疑字符串,则删除它

[CleanInputArgs]
public void CallServer(string sqlarg) 
{
    // logic...
}

public void CleanInputArgs(args)
{
    // here is the thing. iterate over args and 
    // remove all suspicious strings that might be SQL injection
}

这是一个经典的黑名单方法-这是有缺陷的,因为喷油器是如此该死的巧妙。。。每次你添加另一个关键字或一组字符来检查,那些讨厌的攻击者已经有了10个以上的袖子-这是一场毫无希望的上山之战。因此,实际上,您应该使用一种适当的技术,如常规SQL和参数化查询(我认为这是目前首选的方法,而且它可以轻松地处理分页、排序和筛选—相信我!),或者,您更应该使用白名单方法和有效关键字列表您应该查找
usernameFilter
应该包含的内容?为什么不接受一组字符串而不是一个字符串呢?虽然我当然同意你的观点,应该尽可能避免使用动态SQL,但至少有少数情况是无法避免的。我再次指出表达式树。可以构建不容易受到注入攻击的动态SQL语句。只需查看答案中的最后一个链接。
[CleanInputArgs]
public void CallServer(string sqlarg) 
{
    // logic...
}

public void CleanInputArgs(args)
{
    // here is the thing. iterate over args and 
    // remove all suspicious strings that might be SQL injection
}