Я слышал, как люди читают лекции здесь и там в Интернете, что лучше скрывать открытые идентификаторы баз данных в веб-приложениях. Я предполагаю, что они в основном означают в формах и в URL, но я никогда не читал ничего больше, чем полный рот на эту тему.
РЕДАКТИРОВАТЬ : Конечно, теперь, когда я спрашиваю это, я нахожу некоторые ресурсы по этому вопросу:
- /programming/2374538/obscuring-database-ids
- /programming/1895685/should-i-obscure-primary-key-values
- http://joshua.schachter.org/2007/01/autoincrement.html
Эти ссылки удовлетворили часть моего любопытства, но посты SO не имеют большого количества голосов и не обязательно сосредоточены вокруг темы в этом контексте, поэтому я не уверен, что с этим делать, и некоторые из них утверждают, что третье ссылка является фиктивной Я оставлю остальную часть моего поста нетронутым:
Я понимаю разницу между мраком и безопасностью, а также то, как они могут работать вместе, но я не могу себе представить, почему это было бы необходимо.
Есть ли в этом какая-то правда, это просто паранойя, или это просто фальшивка?
Я могу придумать способы сделать это, но, конечно, это добавляет много сложности в код приложения. При каких обстоятельствах это будет полезно? Если это часто делают, как это обычно развертывается то , что люди? Хеширование идентификаторов? Что-то другое? Похоже, много работы для дополнительной безопасности. Я не ищу реальных решений, я просто хочу понять, как / почему люди делают это в реальном мире.
Это действительно считается «наилучшей практикой» или это просто микрооптимизация с малой ценностью?
ПРИМЕЧАНИЕ . Я думаю, что некоторые люди могли ошибиться: я не предполагаю, что трудно угадываемые идентификаторы были бы единственным механизмом безопасности, очевидно, были бы обычные проверки доступа. Давайте предположим, что они есть, и что простого знания идентификатора или хешированного идентификатора записи недостаточно для предоставления доступа.
источник
Это мой взгляд на это:
Хотя «безопасности через неизвестность», очевидно, недостаточно, безвестность может помочь безопасности, хотя бы немного. Вы должны решить, стоит ли эта небольшая psuedo-безопасность дополнительных усилий, необходимых для развертывания чего-то подобного в вашем приложении.
Есть еще одна причина вне безопасности, о которой я могу подумать, чтобы реализовать это:
Конфиденциальность
Допустим, мы имеем дело с идентификаторами пользователей в URL. Если идентификатор пользователя Джо равен,
100
а идентификатор пользователя Боба101
, вероятно, очевидно, что учетная запись Джо была создана первой. Хотя это может не иметь значения в большинстве приложений, это может иметь значение для некоторых. Это пример строгой конфиденциальности через неясность, поэтому, если у вас нет очень сложной системы запутывания идентификаторов пользователей, может быть достаточно легко распустить и выяснить, был ли пользователь с идентификатором3Js9kW3hTs7sa120
более длинным, чем пользователь с идентификаторомQ8Hs73kks0hEg
.По ссылке, на которую я ссылался:
Использование идентификатора автоинкремента публично раскрывает количество объектов в базе данных и может показать, какие из них были созданы первыми, а какие новее. Эта информация может выдать тот факт, что бизнес является новым, или даже не очень хорошо. Например: скажем, вы заказываете книгу, и ваш идентификатор заказа
1
. Может быть очевидно, что ваш заказ был первым в системе, что может расстраивать. Допустим, вы возвращаетесь и заказываете другой, и ваш идентификатор заказа9
. Это дает информацию о том, что только 7 заказов были размещены в сроки между вашими двумя заказами. Это может быть ценной информацией для конкурентов. В этом случае числовой идентификатор автоинкремента, вероятно, лучше запутывать.источник
Слово «неясное», вероятно, слегка вводит в заблуждение и может заставить людей думать «запутывать» или «частично скрывать».
Рекомендуется, чтобы вы никогда не включали какие-либо внутренние ключи базы данных как часть публичного URL, если эти записи базы данных содержат какие-либо конфиденциальные данные.
Просто слишком легко играть с числами в URL и получать доступ к другим записям.
источник
/account/8hdy39s1lks062dfasd4
и отображается на реальном счете, он не должен иметь доступа в любом случае.Я пойду против мейнстрима и скажу вам, что использование случайного длинного идентификатора, на мой взгляд, является довольно приличной формой безопасности.
Тем, кто имеет доступ к этим данным, должно быть ясно, что они так же чувствительны, как и пароль. И, конечно, у него есть недостаток в том, что если он выйдет в дикую природу, его будет сложнее изменить.
Но у него есть пара преимуществ по сравнению с обычной парой имени пользователя и пароля. Во-первых, у пользователя нет выбора, так что вы можете быть уверены, что об этом практически невозможно догадаться. Нет смысла проектировать совершенно безопасный сайт, когда администратор выбирает его имя в качестве пароля. Во-вторых, каждый элемент имеет свой идентификатор, поэтому, если один получает доступ к одному элементу, это не помогает с другим.
Конечно, чем больше слоев безопасности, тем лучше. Но один этот метод может быть более безопасным, чем пара учетных данных.
источник
Здесь есть два аспекта: удобство использования и безопасность.
С точки зрения безопасности скрывать идентификаторы довольно бессмысленно; важно то, что идентификатор никогда не должен быть единственным «ключом» к любому непубличному ресурсу. Это означает, что если вы хотите предоставить выбранным пользователям доступ к определенной странице, просто недостаточно указать идентификатор страницы в URL-адресе, вам необходимо реализовать реальный механизм безопасности, такой как имя пользователя / пароль для входа или аутентификация с открытым / закрытым ключом, а также надлежащая авторизация (то есть система должна иметь возможность судить в каждом конкретном случае, разрешено ли пользователю X доступ к ресурсу Y, и действовать соответственно).
С точки зрения удобства использования, общий совет заключается в том, чтобы скрывать искусственные ключи: они не имеют никакого значения для пользователя, и, раскрывая их очевидными способами, вы вводите дополнительную зависимость, с которой особенно трудно справиться, поскольку она живет вне сфера программного обеспечения - люди будут записывать, отправлять по электронной почте, факсу, распечатывать, добавлять в закладки и т. д. эти идентификаторы, и если вы когда-нибудь их поменяете, вас ждут несколько раздражающих билетов в службу поддержки.
источник
Нет , вы абсолютно точно не хотите разрешать доступ к произвольным ресурсам, просто зная их внутренний идентификатор. Это Интернет, независимо от того, какое злостное, преступное или детское присутствие вы можете себе представить, на самом деле существует , и рано или поздно они попадут на ваш сайт. Если все, что вы могли бы обслуживать, не будет полностью общедоступным (и если у вас есть хотя бы один клиент, который гарантированно не будет иметь место), вы должны ограничить доступ для тех, кто фактически уполномочен иметь его.
Обычное решение состоит в том, чтобы использовать токены авторизации некоторого вида, которые хранятся в зашифрованном сеансе, и проверяет, проверяет ли что-то видимое для аутентифицированного пользователя перед его отправкой. Это может быть реальный менеджер безопасности, такой как тот, который поставляется с JDK, или любой другой компонент, который выполняет ту же роль, если он делает это последовательно. (Раскрыть ли внутренние идентификаторы кому-то, кто уже аутентифицирован или нет, это также интересный вопрос с различными плюсами и минусами, но это не так важно для безопасности.)
Трудно это рассчитать, пока на вас действительно не нападет кто-то, кто имеет в виду бизнес. Тогда, как правило, разница между уходом из бизнеса и отказом от очередного сорванного сценария.
источник
Очевидно, это зависит от того, насколько конфиденциальны данные, но для обеспечения средней безопасности я бы сделал минимум, чтобы включить идентификатор и значение контрольной суммы.
Создайте контрольную сумму, добавив соль (т.е. набор случайных символов) до и после идентификатора и выполнив MD5 для значения.
На каждой странице, которая читает значение идентификатора, она должна генерировать значение контрольной суммы и сравнивать его с переданной, отклонять запрос, если он не совпадает.
Если потенциальный хакер может получить достаточное количество допустимых комбинаций, он может вычислить значение Salt методом грубой силы, так что если вы можете добавить еще один уровень безопасности, такой как проверка идентификатора пользователя, который также поможет.
источник