C# 我可以避免通过WebAPI路由表达式吗?(他们甚至都被击溃了吗?) 我的问题
我可以避免通过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;} } 公共
//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
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请求验证似乎不包括这些情况。看,还是我遗漏了什么?