Breeze.js — защита вызовов IQueryable

Я новичок в этом, но я пришел к пониманию рисков безопасности, связанных с использованием Breeze для раскрытия IQueryable‹>. Может кто-нибудь предложить мне некоторые передовые методы (или просто некоторые рекомендации) для защиты коллекции IQueryable, которая отображается в JavaScript? Спасибо.


person CCPony    schedule 13.12.2012    source источник
comment
Было бы полезно узнать больше о том, что вас беспокоит. Не о чем беспокоиться, если тип StatusCodes. Больше думать о том, если это клиенты. Но это так независимо от того, IQueryable или нет. Было бы лучше, если бы вы перечислили некоторые конкретные проблемы... и тогда мы сможем на них ответить. Пожалуйста, сделай! Мы все приветствуем такую ​​конкретику.   -  person Ward    schedule 14.12.2012
comment
возможный дубликат Как breeze.js обрабатывает безопасность и избегать раскрытия бизнес-логики   -  person Edward Brey    schedule 20.02.2014


Ответы (2)


Я бы не стал раскрывать какие-либо данные через IQueryable, которые не должны быть отправлены клиенту через случайный запрос. Таким образом, проекция может быть раскрыта или DTO.

Я не уверен, что это отвечает на ваш вопрос, хотя ... Какие «угрозы безопасности» вас беспокоят?

person John Papa    schedule 13.12.2012

Я тоже поддерживаю этот вопрос. Но добавим некоторые детали к вопросам, которые задавал Уорд:

При защите запрашиваемых сервисов на ум приходят две традиционные проблемы:

1) Вертикальная безопасность: какие элементы пользователь, вошедший в систему в данный момент (на основе удостоверения пользователя или ролей), НЕ может видеть в пользовательском интерфейсе. Их необходимо удалить из запрашиваемого списка. IMO, это можно сделать как часть запрашиваемой магии ActionFilter, связав некоторую логику исключения в возвращаемом IQueryable. 2) Горизонтальная безопасность: некоторые модели содержат поля, которые не подходят для просмотра (и/или редактирования) вошедшим в систему пользователем. С этим сложнее справиться, поскольку речь идет не просто об удалении экземпляров из возвращенного IQueryable. Возвращаемый класс имеет другую форму и, следовательно, может обрабатываться либо средством форматирования json, опускающим поля на основе безопасности (что AFAIK испортит метаданные бриза), либо вы возвращаете DTO, и в этом случае, поскольку DTO не существует в метаданных это не полный жизненный цикл (обновляемый) класс? (это я не утверждаю)

Хотелось бы видеть либо встроенную поддержку, либо простые в реализации рецепты под номером 2). Возможно, какой-нибудь пример кода для изменения метаданных на стороне клиента, чтобы DTO отлично работали в сочетании с объектами модели. Шаблоны SPA новостей VS 2012 (в приложении TodoList), похоже, подталкивают варианты DTO объекта модели как на запрашиваемой стороне, так и на стороне вставки/обновления. Это похоже на традиционные представления моделей MVC...

Наконец, я бы добавил запрос на автоматическую обработку проблемы безопасности с оверпостингом для вставок и обновлений. Это обратный аспект 2). Некоторые пользователи не должны иметь возможность редактировать определенные поля.

person t316    schedule 23.12.2012
comment
Достойные наблюдения. Большая тема... я надеюсь затронуть ее в ближайшие месяцы. Подойдет ваше предложение по вертикальной безопасности; много раз вы можете добавить фильтрацию на основе ролей к самому методу запроса либо в методе контроллера, либо (лучше) в подклассе ContextProvider, который перемещает бизнес-логику из контроллера в бизнес-модель. См. следующий комментарий для размышлений о Horizontal - person Ward; 04.01.2013
comment
Да рецептам. Ознакомьтесь со статьей Джули Лерман на MSDN Jan, также посвященной ограничению модели EF в соответствии с предметной областью. Как вы заметили, это не помогает, когда определенные пользователи не должны видеть определенные значения. ContractResolver сериализатора Json.NET может быть хорошей ставкой здесь. Вы также можете просто написать не запрашиваемый метод службы, который возвращает IEnumerable запрошенного типа; вы можете запросить внутри этого метода и детально обработать результаты, прежде чем возвращать их клиенту. Все, что вы теряете, — это запросы OData; все еще может отправлять параметры. Продолжение следует ... - person Ward; 04.01.2013
comment
Re: оверпостинг... как бы вы хотели, чтобы мы это автоматизировали? Вы имеете в виду защиту от обновлений свойств, которые не отображаются через запросы? Если это так, первое, на что следует обратить внимание, — это сжатие поверхности сущности (см. статью Джули). Или вы имеете в виду публикацию в свойствах, которые они могут видеть, но не должны касаться? На вы знаете правила для этого. Являются ли методы BeforeSave... недостаточными? Они существуют частично для этой цели. - person Ward; 04.01.2013
comment
Несмотря на это, мы должны предложить некоторые рекомендации и выбор. Вы можете многое сделать, прежде чем вернуться к чистым DTO и разделению команд/запросов... что является вашей конечной опорой. - person Ward; 04.01.2013
comment
Я хотел бы добавить, что язык на основе динамического сервера действительно был бы здесь великолепен, поскольку мы могли бы просто удалить свойства объектов, которые пользователю не разрешено видеть. - person Kurren; 13.11.2015