2012-04-05 4 views
6

Это вопрос шаблона для начинающих для создания веб-форм. Я прочитал Exposing database IDs - security risk?, и принятый ответ заставил меня подумать, что это пустая трата времени, но подождите ...Отображение идентификаторов базы данных в пользовательском интерфейсе

У меня есть проект MVC, ссылающийся на библиотеку бизнес-логики и сборку репозиториев NHibernate SQL, ссылающихся на них. Если что-то заставило мою руку пойти и ссылаться на эти репозитории непосредственно из моей кодовой базы контроллера, я бы знал, что пошло не так. Но когда эти контроллеры говорят по параметрам URL с идентификаторами записей базы данных, делает ли это только ?

Я не могу представить, что эти идентификаторы когда-либо превращаются в нерасходуемые (посредством действий MVC). Я не думаю, Мне понадобится два объекта пользовательского интерфейса, соответствующие одной и той же строке в базе данных. Я не намерен для контроллера интерпретировать идентификатор каким-либо образом. Суррогатные ключи будут иметь нулевую разницу. Тем не менее, я хочу иметь проблему, потому что предположения о рациональном дизайне не лучше, чем зависимости от пропусков слоев.

Как сделать веб-приложение, которое ссылается только на сборку бизнес-логики и переговоры в объектах BL и GUID, которые имеют смысл только для этого сеанса, в то время как сборка продолжает транзакции с использованием идентификаторов базы данных?

ответ

3

Вы можете зашифровать или хеш, если вы хотите. Использование идентификатора сеанса как соли. Это зависит от контекста. Общественный торговый сайт, который вы хотите, чтобы страницы каталога были четкими, легко копируется. Учетная запись пользователя admin - это нормально, чтобы шифровать идентификаторы, поэтому пользователи не могут взломать чужую учетную запись.

Я бы не считал это безопасностью безвестности. Если у злонамеренного пользователя есть одна скомпрометированная учетная запись, они могут просматривать все поля формы, идентификаторы URL и значения cookie, установленные во время входа в систему в качестве этого пользователя. Затем они могут попытаться использовать их при входе в систему как другой пользователь для повышения разрешения. Но защищая их, используя идентификатор сеанса как соли, вы заблокировали эти данные, поэтому это полезно только в одном сеансе. Страницы не могут быть отмечены закладкой. Могли ли они выяснить вашу защиту? Возможно. Но, скорее всего, они просто перейдут на другой сайт. Блокировка двери вашего автомобиля не оставляет никого из вашего автомобиля, если они хотят войти, но это затрудняет работу, поэтому каждый делает это.

+0

Ты дал мне много подумать. Можете ли вы сделать какие-либо предложения о том, как реализовать сопоставление и где его хранить? Действительно ли «сессия» - лучшее место в ASP? –

+0

"картирование"? Непонятно, что вы ищете. Защита на местах? Я просто предложил вам выполнить функцию шифрования, которая принимает: FieldName, FieldValue, SessionID. Затем, когда вы расшифровываете, вам также нужно предоставить все 3 для расшифровки. Так что кто-то в другой сессии не может полностью захватить эту ценность. Должно быть все, что вам нужно для параметров URL. Если вам когда-либо понадобится поддержка бессетевых страниц, вы можете использовать жестко заданное значение вместо идентификатора сеанса, а не как безопасные, но сеансовые страницы не должны получать доступ к чему-либо чувствительному. –

+0

Я отложил суть вашего ответа, солью с сеансом: нет необходимости хранить/управлять сопоставлениями вообще - они сохранялись бы точно так же долго. Это круто. Спасибо. –

3

Я не эксперт по безопасности, но у меня нет проблем с предоставлением пользователю определенных идентификаторов, таких как идентификаторы продуктов, идентификаторы пользователей и все, что пользователь мог бы нормально читать, что означает, если я покажу продукт на пользователь, отображающий свой идентификатор продукта, не является проблемой.

Вещи, которые являются внутренними для системы, с которыми пользователи не взаимодействуют напрямую, например Идентификаторы транзакций, я не показываю пользователю, не опасаясь их редактирования каким-либо образом, а просто потому, что это не информация, которая полезный для них.

Довольно часто в формах у меня бы появился пункт действия «mysite.com/messages/view/5», где 5 - это сообщение, которое они хотят просмотреть. В все этих действий я всегда гарантирую, что у пользователя есть доступ к его просмотру (изменение или удаление, когда-либо требуемые функции), выполнив простую проверку базы данных и убедитесь, что зарегистрированный пользователь равен владельцу сообщений.

+0

Да, при запутывании URL-адресов, чтобы не выставлять идентификаторы базы данных, это всего лишь форма безопасности через неясность. Вы не должны полагаться на запутанные URL-адреса для вашей безопасности. Вам по-прежнему необходимо активно внедрять некоторые другие формы управления разрешениями, которые подходят для вашего приложения. –

+0

Вы не должны полагаться _only_ на это. Но вам также не нужно делать вещи для хакеров. –

+0

Я определенно выполнил проверку работоспособности именно по этим строкам: вы показываете все, начиная с строки 5, кто заботится, если вы также говорите: «Если вам нужно знать, что это строка 5». Моя проблема была в основном в том, что мои модели просмотра имеют 1-1 для моих объектов BL и 1-1 для моих объектов ORM - это совпадение, которое я не хочу делать. –

0

В то время как вы найдете людей, которые говорят, что идентификаторы - это всего лишь детали реализации, в большинстве систем вам нужен способ однозначной идентификации объекта домена, и, скорее всего, вы будете генерировать идентификатор для этого идентификатора. Тот факт, что идентификатор составляет , сгенерированный базой данных, представляет собой деталь реализации; но как только он был сгенерирован, он становится атрибутом объекта домена, и поэтому вполне разумно использовать его везде, где вам нужно ссылаться на объект.

2

Будьте очень осторожны, поскольку изменение параметров может привести к модификации данных. Правила о том, «кто может получить доступ к тем идентификаторам», должны быть очень тщательно встроены в ваше приложение, когда выставляете эти идентификаторы.

Например, если вы обновляете заказ на основе OrderId, включите в предложение where для загрузки и обновления: , где order.orderid = passInOrderId и Order.CustomerId =

Я разработал расширение, чтобы помочь с сохраненными идентификаторами в MVC можно ознакомиться здесь:

http://mvcsecurity.codeplex.com/

Также я говорить об этом немного в моем курсе безопасности по адресу: Hack Proofing your ASP.NET MVC and Web Forms Applications

+0

Проект codeplex выглядит очень похоже на технику, которую мы здесь используем. Но мы не используем машинный ключ, мы используем ключ из поддерживаемого базы данных, поэтому он работает во всех разных ящиках. Я очень удивляюсь всем, кто думает, что у них никогда не будет какой-либо ошибки, когда они увидят безупречную проверку доступа пользователей. Это просто не настоящий мир. –

+0

Хорошее предложение, и он проведет проверку прав/роли в BL, где он работает с реальными идентификаторами. –

1

Помимо этих ответов иногда бывает полезно использовать очевидные идентификаторы, чтобы люди могли взломать URL-адрес необходимой им информации. Например, www.music.com \ artist \ acdc или www.music.com \ arist \ smashing-тыквы. Если это имеет смысл для ваших пользователей, и если вы можете увеличить информацию, которую пользователь понимает со страницы через URL-адрес, то все лучше и особенно, если ваш сегмент рынка молод или технически подкован, тогда используйте идентификатор в своих интересах. Это также повысит ваш SEO. Я бы сказал, когда он не используется, а затем закодируйте его. Это одна ошибка одного разработчика, чтобы не проверять идентификатор клиента на сеанс, и вы раскрываете всю свою клиентскую базу.

Но, конечно, ваши юнит-тесты должны их поймать!

+0

Это еще одна вещь, о которой нужно подумать - либо информативная, и четкая, либо временная и бессмысленная, но я продолжаю чувствовать, что унаследовал от БД только потому, что это не так; любые предложения о том, как реально реализовать сопоставление для любого вида? Просто колонка в БД для удобства, я бы подумал –

+0

О, я вижу. Вы имеете в виду картирование разбитых тыкв до 1456789. Я думаю, что это была бы другая колонка в db. Но большинство примеров mvc, которые я вижу, просто используют идентификаторы ints повсюду. Проблема в том, что 1456789 автоматически генерируется автоматически. Все, что вы пытаетесь сделать с одним из других значимых полей, может быть не уникальным, и если оно не является уникальным, нехорошо пытаться использовать его для запроса. Если вы не делаете что-то вроде hotmail, smashing-тыквы, smashing-pumpkins8973232 и т. Д. –