Как перехватить исключения 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 ответ

Может быть что-то подобное поможет? -

Опция 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>.......
Другие вопросы по тегам