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