Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以避免通过WebAPI路由表达式吗?(他们甚至都被击溃了吗?) 我的问题_C#_Asp.net Web Api_Lambda - Fatal编程技术网

C# 我可以避免通过WebAPI路由表达式吗?(他们甚至都被击溃了吗?) 我的问题

C# 我可以避免通过WebAPI路由表达式吗?(他们甚至都被击溃了吗?) 我的问题,c#,asp.net-web-api,lambda,C#,Asp.net Web Api,Lambda,我可以避免通过WebAPI输入参数路由表达式吗?这有可能发生吗 我的处境(背景) 我有一些代码与此非常类似(这是一个简化,以使要点更清楚): //DTO类: 公共抽象类FilterableDtoBase { 公共字符串FilterValue{get;set;} 公共抽象表达式筛选器表达式{get;} 公共排序器排序器{get;set;}//Enum:SortOrder.Ascending,SortOrder.discending 公共抽象表达式OrderExpression{get;} } 公共

我可以避免通过WebAPI输入参数路由表达式吗?这有可能发生吗

我的处境(背景) 我有一些代码与此非常类似(这是一个简化,以使要点更清楚):

//DTO类:
公共抽象类FilterableDtoBase
{
公共字符串FilterValue{get;set;}
公共抽象表达式筛选器表达式{get;}
公共排序器排序器{get;set;}//Enum:SortOrder.Ascending,SortOrder.discending
公共抽象表达式OrderExpression{get;}
}
公共类InvoiceInVoiceNumberFilterabledTo:FilterableDtoBase
{
公共表达式FilterExpression{get;}=i=>i.InvoiceNumber.Contains(FilterValue);
公共表达式OrderExpression{get;}=>i=>i.InvoiceNumber;
}
//在web API控制器类中:
[HttpGet]
[路线(“发票/”)]
公共异步任务GetInvoices([FromUri]InvoiceInVoiceNumberFilterabledTo请求)
{
//模拟EF:myDatamodel。发票是可查询的
var results=myDatamodel.Invoices.Where(request.filtereexpression);
if(request.SortOrder==SortOrder.Ascending)
results=results.SortBy(request.OrderExpression);
其他的
结果=results.SortByDescending(request.OrderExpression);
返回结果;
}
这背后的目标有两个:

  • 使逻辑具有足够的可重用性,以便我可以通过代码库不断添加这些逻辑,而不会重复太多类似的行为
  • 允许使用者具有一致的
    FilterValue=x&SortOrder=singressing
    行为
然而,由于这种设计,我意识到我正在将从请求DTO构造的lambda直接传递到我的模型中,DTO的属性将作为任何其他属性公开给Web API映射

问题:

是否可以构造URI/请求主体,以便服务的使用者可以构造任何lambda表达式,以用于对付我?我想知道这是否是WebAPI允许的

例如,有人可以呼叫
http://example.com/invoices?FilterExpression=Expression.Call(MethodName=SQL,“DROP TABLE”)…
,或者以任何方式让攻击者控制我的代码的表达式

如果是这样,我可以防止某些属性被Web API路由吗


更新:我的目标是不允许客户端提交表达式。我的目标是确保这不会发生,这样我就不会暴露在安全问题中。表达式仅用于从系统中的不同实体中提取过滤器。

您可能应该使用其他设计。您的模型
FilterableDtoBase
应该只包含您希望从请求中得到的字段

从安全的角度看,我看不出有任何问题。您所指的路由过程实际上是模型绑定

我们在默认配置中有一些ModelBinder。表达式没有ModelBinder

您可以使用创建自己的模型绑定器,该绑定器可以支持类似的内容,但出于明显的原因,您不应该这样做

最好使用描述符DTO:

public abstract class FilterableDescriptor
{
    public string FilterValue { get; set; }
    public SortOrder SortOrder { get; set; } // Enum: SortOrder.Ascending, SortOrder.Descending
}
还有一种扩展方法如下:

public static IQueryable ApplyFilter(this IQueryable query, FilterableDescriptor)
{
    //Your logic
    return query;
}
var results = myDatamodel.Invoices.Where(request.FilterExpression);
return results.ApplyFilter(request);
然后你可以这样做:

public static IQueryable ApplyFilter(this IQueryable query, FilterableDescriptor)
{
    //Your logic
    return query;
}
var results = myDatamodel.Invoices.Where(request.FilterExpression);
return results.ApplyFilter(request);

C#Web API内置了一个将触发
潜在危险请求的
异常。如果您使用的是标准的Web API解决方案/项目,那么您究竟是如何获得要绑定到
表达式
对象的参数的?!我会对完全开放式的表达式请求对象保持警惕。相反,我会基于一个固定的请求对象动态构建一个表达式,如下所示LinqKit@Jacob我不是,但我的问题是:这能做到吗?(这会翻译成“我有麻烦了吗?”)@Jake请求验证似乎不包括这些情况。看,还是我遗漏了什么?