如何拦截IQueryable异常

时间:2015-12-08 23:00:49

标签: c# exception asp.net-web-api odata iqueryable

在我工作的公司进行安全审核期间,Web.API出现了一个问题,如果用户要为示例更改提供的值,则会返回太多信息。

合法通话的示例:https://mysite/controller/myData?$ orderby = realcolumn

恶意电话示例:https://mysite/controller/myData?$ 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."
}

虽然我不认为这是一个大的安全问题,并且作为开发人员有这种类型的响应是有帮助的...我被要求使其更通用 - 基本上提供尽可能少的信息。

在将响应发送回用户之前,我不知道如何捕获它。如果我遍历代码并在返回结果之前停止,那么数据就在那里。在这种情况下,直到控制器中发生返回之后,才会计算订单。有没有办法在服务器上执行评估,捕获这样的错误并返回更通用的响应?

以下代码段,我感谢您提供的任何帮助。

来自控制器

RepositoryMyData _repo;

[HttpGet]
public IQueryable<myData> myData()
{
   return _repo.myData();
}

从Repository类 - 使用Entity Framework ...

public DbQuery<myData> myData()
{
   return (DbQuery<myData>)_contextProvider.Context.myData
}

1 个答案:

答案 0 :(得分:0)

这可能会有所帮助吗? -

选项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.
   }
}

选项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>.......