C# 如何拦截IQueryable异常

C# 如何拦截IQueryable异常,c#,exception,asp.net-web-api,odata,iqueryable,C#,Exception,Asp.net Web Api,Odata,Iqueryable,在我工作的公司进行安全审查期间,如果用户更改示例中提供的order by值,则Web.API返回的信息过多,从而引发了一个问题 合法调用的示例:?$orderby=realcolumn 恶意调用示例:?$orderby=fakecolumn 在第二种情况下,api返回: { "$id": "1", "$type": "System.Web.Http.HttpError, System.Web.Http", "Message": "The query specified in the

在我工作的公司进行安全审查期间,如果用户更改示例中提供的order by值,则Web.API返回的信息过多,从而引发了一个问题

合法调用的示例:?$orderby=realcolumn

恶意调用示例:?$orderby=fakecolumn

在第二种情况下,api返回:

{
  "$id": "1",
  "$type": "System.Web.Http.HttpError, System.Web.Http",
  "Message": "The query specified in the URI is not valid. Could not find a property named 'fakecolumn' on type 'MyObject.Models.MyData."
}
虽然我不认为这是一个大的安全问题,作为一个开发人员,有这种类型的响应是有帮助的。。。我被要求将这一点变得更一般——基本上提供尽可能少的信息

在将响应发送回用户之前,我不知道如何捕获此信息。如果我遍历代码并在返回结果之前停止,那么数据就在那里。在这种情况下,在控制器中发生返回之前,不会对order by进行求值。有没有一种方法可以在服务器上执行评估,捕获类似这样的错误并返回更通用的响应

下面是代码片段,我感谢您提供的任何帮助

来自控制器

RepositoryMyData _repo;

[HttpGet]
public IQueryable<myData> myData()
{
   return _repo.myData();
}
RepositoryMyData\u repo;
[HttpGet]
公共IQueryable myData()
{
返回_repo.myData();
}
来自存储库类–使用实体框架…

public DbQuery<myData> myData()
{
   return (DbQuery<myData>)_contextProvider.Context.myData
}
公共数据库查询myData() { 返回(DbQuery)_contextProvider.Context.myData }
这样做会有帮助吗-

选项1:

//customer exception class
public class QueryError : Exception{
}

[HttpGet]
public IQueryable<myData> myData()
{
   try{
        return _repo.myData();
   }catch(Exception e){
        throw new QueryError("An error occurred.");
        // not a good practice though, too much exceptions to handle for the system.
   }
}
//客户异常类
公共类查询错误:异常{
}
[HttpGet]
公共IQueryable myData()
{
试一试{
返回_repo.myData();
}捕获(例外e){
抛出新的QueryError(“发生错误”);
//但这不是一个好的实践,系统需要处理太多的异常。
}
}
选项2:

public  class CustomHandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
    public override void OnException(ExceptionContext context)
    {
        context.ExceptionHandled = true;
        context.HttpContext.Response.Clear();
        context.Result = //build the result with needed information
    }
}

[CustomHandleError]
public lass <Controller>.......
公共类CustomHandleErrorAttribute:System.Web.Mvc.HandleErrorAttribute
{
公共覆盖无效OneException(ExceptionContext上下文)
{
context.ExceptionHandled=true;
context.HttpContext.Response.Clear();
context.Result=//使用所需信息生成结果
}
}
[CustomHandleError]
公共部门。。。。。。。

在这种情况下,好莱坞电影通常会在厚厚的红色边框中显示闪烁的红色错误。您可能应该添加一个自定义异常处理程序,以确保错误响应不包含“太多信息”。创建ExceptionFilterAttribute的子类并将其添加到全局筛选器。见:马克-谢谢你的反馈!我能够让一个自定义错误处理程序在控制器中处理异常。然而,如果我通过或$top=10,例如。。。我仍然得到默认的JSON错误,如我的帖子所示。就好像$orderby/$top等。。。没有在控制器内进行计算,或者发生在之后,并且自定义处理程序没有拾取它。您是否也要以某种方式关闭/$metadata?这将是‘信息披露’的最大差距。我不确定我是否得到了“列不存在”与“这是它的完整模式”的“信息披露”权重平衡?感谢您的反馈!如果控制器代码中出现错误,选项2将起作用。例如,如果我抛出一个异常,比如:抛出新异常(“发生了不好的事情”);返回_repo.myData();然后自定义处理程序将其拾取。但是,如果通过url传递错误信息生成错误,例如$top=ten或$orderby=invalidcolumn。。。。然后不会调用自定义处理程序,并生成默认异常,如我的原始帖子中的JSON所示。