Викриття ідентифікаторів бази даних - ризик безпеки?


134

Я чув, що відкриття ідентифікаторів бази даних (наприклад, у URL-адресах) є ризиком для безпеки, але у мене виникають проблеми з розумінням того, чому.

Будь-яка думка чи посилання на те, чому це ризик чи чому це не так?

РЕДАКТУВАННЯ: звичайно, доступ обмежений, наприклад, якщо ви не можете бачити ресурс, foo?id=123ви отримаєте сторінку помилок. Інакше сама URL-адреса має бути секретною.

EDIT: якщо URL-адреса є секретною, вона, ймовірно, містить генерований маркер, який має обмежений термін служби, наприклад, дійсний протягом 1 години і може бути використаний лише один раз.

EDIT (місяці пізніше): моя сучасна краща практика для цього - використовувати UUIDS для ідентифікаційних номерів та викривати їх. Якщо я використовую послідовні номери (як правило, для продуктивності в деяких БД) як ідентифікатори, мені подобається генерувати маркер UUID для кожного запису як альтернативний ключ, і викриваю це.

Відповіді:


109

Враховуючи належні умови, виявлення ідентифікаторів не є ризиком для безпеки. І на практиці було б надзвичайно обтяжливим розробити веб-додаток, не виставляючи ідентифікаторів.

Ось кілька хороших правил, яких слід дотримуватися:

  1. Використовуйте захист на основі ролей, щоб контролювати доступ до операції. Як це зробити, залежить від обраної вами платформи та основи, але багато хто підтримує декларативну модель захисту, яка автоматично перенаправляє браузери на етап аутентифікації, коли для дії потрібен певний авторитет.
  2. Використовуйте програмну безпеку для управління доступом до об'єкта. Це складніше зробити на рамковому рівні. Частіше це потрібно записати у свій код, і тому воно більше схильне до помилок. Ця перевірка виходить за рамки рольової перевірки, забезпечуючи не лише те, що користувач має повноваження на роботу, але і має необхідні права на конкретний об'єкт, що змінюється. У системі, що базується на ролях, легко перевірити, чи можуть підвищувати підвищення лише керівники, але крім цього вам потрібно переконатися, що працівник належить до конкретного менеджерського відділу.
  3. Для більшості записів бази даних умови 1 і 2 є достатніми. Але додавання непередбачуваних ідентифікаторів може розглядатися як трохи додаткове страхування або "безпека в глибині", якщо ви купуєте це поняття. Однак одне місце, де непередбачувані ідентифікатори є необхідністю, - це ідентифікатори сеансу чи інші маркери аутентифікації, де ідентифікатор сам підтверджує запит. Вони повинні бути породжені криптографічним RNG.

27
ІМО, додаючи непередбачувані посвідчення особи - це підхід "безпеки через неясність" і може призвести до помилкового почуття безпеки. Краще зосередитись на (1) та (2) та переконатися, що контроль доступу є надійним.
stucampbell

4
Використання криптографічного RNG, безумовно, не "безпека через незрозумілість". Зловмисник не ближче до відгадування ідентифікаторів об'єктів, навіть коли вона знає, як ви їх генеруєте. Безпека через невідомість означає, що якщо алгоритм, який ви використовуєте, буде виявлений, він може бути використаний. Це не стосується збереження секретів, як-от ключів або внутрішнього стану RNG.
erickson

1
@stucampbell Можливо, але це не означає, що ви взагалі не повинні використовувати непередбачувані ідентифікатори. Помилки трапляються, тому непередбачувані посвідчення особи є додатковим механізмом безпеки. Крім того, контроль доступу не є єдиною причиною їх використання: передбачувані ідентифікатори можуть виявляти конфіденційну інформацію, таку як кількість нових клієнтів протягом певного періоду часу. Ви дійсно не хочете викривати таку інформацію.
користувач247702

1
@Stijn ти не можеш сказати, що я "дуже не хочу", щоб викрити, скільки у мене клієнтів. Я маю на увазі, що Макдональдс має величезний знак, який говорить про те, що вони служили 10 мільярдів гамбургерів. Це зовсім не ризик для безпеки, це перевага. Крім того, ви повинні увійти, перш ніж побачити будь-які URL-адреси в більшості програм, де ми все одно будемо турбуватися про це. Тому ми б знали, хто збирає дані.
Уейн Блос

1
Одне, що я не бачив згадуваного в цій розмові, - це те, що з точки зору усунення несправностей та простоти у використанні може бути дуже зручно відкрити ІД-адресу в URL-адресі, щоб допомогти спрямувати користувачів на певний ресурс або дати їм змогу щоб точно сказати, який ресурс вони переглядають. Ви здебільшого можете уникнути проблем з бізнес-аналітикою, запустивши автоматичний приріст з більш високим значенням, просто запропонувавши одну ідею.
Chockomonkey

47

Хоча це не ризик безпеки даних, це абсолютно ризик безпеки бізнес-розвідки, оскільки він піддається як розміру, так і швидкості передачі даних. Я бачив, як підприємства завдають шкоди цим і дуже глибоко писали про цей антидіапазон. Якщо ви просто не будуєте експеримент, а не займаєтесь бізнесом, я настійно рекомендую не допускати публічних ідентифікаторів. https://medium.com/lightrail/prevent-business-intelligence-leaks-by-using-uuids-instead-of-database-ids-on-urls-and-in-apis-17f15669fd2e


4
Нарешті, обгрунтована відповідь, яка містить інші аспекти, ніж ризик безпеки.
peceps

2
Це має бути прийнятою відповіддю. Якщо ви припускаєте, що зловмисник може обійти вашу безпеку (що завжди слід робити), ви не хочете просто передавати таку інформацію.
Кріль

@Kriil Їм навіть не потрібно обходити вашу безпеку. Їм просто потрібно створити рахунок!
Петро

32

Це залежить від того, на що стоять посвідчення особи.

Подумайте про сайт, який з конкурентних причин не хоче оприлюднювати, скільки членів у них є, але за допомогою послідовних ідентифікаторів це все одно розкриває його в URL: http://some.domain.name/user?id=3933

З іншого боку, якщо вони замість цього використовували ім'я користувача для входу: http://some.domain.name/user?id=some, вони нічого не розголошували, про що користувач ще не знав.


2
якщо ви використовуєте послідовні ідентифікатори, ви маєте рацію, але якщо ні, то це нічого не викриває
відкрийте

@orip: Як я вже говорив, це залежить від того, що хтось може виявити, вивчивши кілька ідентифікаторів. Чи є закономірність? Чи можуть вони використовувати цю інформацію для отримання інформації, якої вони не мають на меті?
десь

@John: Дякую за редагування. Англійська мова не є моєю рідною мовою :)
десь

6
Я зробив саме це: використовував послідовні ідентифікаційні номери, щоб визначити розмір бази даних конкурента.
Міхей

3
Вони є скрізь. Багато магазинів використовують послідовний номер для ідентифікатора замовлення. Розмістіть одне замовлення в одну дату, а інше на іншу дату, і ви знаєте, скільки замовлень вони отримали за той період. Навіть якщо ви не знаєте, скільки коштують замовлення, ви все одно отримаєте вказівку на те, наскільки добре працює бізнес.
десь

25

Загальна думка випливає за такими напрямками: "Розкривайте кому-небудь мало інформації про внутрішню роботу вашого додатка".

Розкриття ідентифікатора бази даних вважається розкриттям деякої інформації.

Причини цього в тому, що хакери можуть використовувати будь-яку інформацію про внутрішню роботу ваших додатків, щоб напасти на вас, або користувач може змінити URL-адресу, щоб потрапити в базу даних, яку він / вона не повинен бачити?


1
Доступ до ресурсів вони не повинні бачити - лише якщо я не перевіряю дозволи (що я роблю, інакше у мене є інша проблема безпеки). Розкриття інформації про "внутрішню роботу" - ось саме моє питання. Чому це проблема?
orip

8
@orip: Вся справа в тому, щоб бути максимально безпечним. Якщо ви такий програміст, який не помиляється, то це не проблема. В іншому випадку викриття меншої кількості деталей ускладнює експлуатацію коду, якщо (коли) ви робите помилки. Ви самі маєте рацію, це не додає безпеки.
Адам Беллер

@Adam: Поверхнева безпека може бути гіршою, ніж відсутність безпеки. Якщо ви не маєте явного захисту, ви маєте явний захист, і ви можете подумати, що це додасть щось несуттєве.
Оріп

16

Ми використовуємо GUID для ідентифікаторів баз даних. Витікати їх набагато менш небезпечно.


Це я б запропонував. Набагато менше шансів відгадати GUID-адреси у вашій базі даних.
Джон Еріксон

6
Це спричиняється штрафом за продуктивність. Дивіться тут
Єшурун

2
Цікава річ 1 щодо використання посібників - це те, що ви можете дозволити клієнтам генерувати ідентифікатори бази даних. Цікава річ 2 - це те, що вони не мають проблем із роздробленими базами даних, як це роблять автоматичні розширювальні ідентифікатори.
Брайан Уайт

Чи використовуєте ви ці GUID-файли також у html-коді як атрибути id для ідентифікації користувачів, коментарів, публікацій? Щоб вказати, на яке посилання користувач натиснув або яке повідомлення він хоче прокоментувати?
trzczy

7

Якщо ви використовуєте цілі ідентифікатори у своєму db, ви можете полегшити користувачам бачити дані, які вони не повинні, змінюючи змінні qs.

Наприклад, користувач може легко змінити параметр id у цьому питанні та побачити / змінити дані, які вони не повинні http: // someurl? Id = 1


7
Якщо я не перевіряю дозволи, у мене є інша проблема безпеки.
orip

але відповідь точна: "може"
Seun Osewa

1
Питання не в тому, чи ви перевірите дозволи. Це якщо новий прокат, якого ви не знаєте, перевірить дозволи.
Брайан Уайт

@BrianWhite - саме тому ви хочете, щоб процес перегляду коду був на місці, щоб ви могли навчити їх, перш ніж він потрапить у виробництво.
candu

2
Що ми робимо, це зашифрувати цілі ідентифікатори при використанні в змінних URL або форми.
Брайан Уайт

6

Коли ви надсилаєте ідентифікатори бази даних своєму клієнту, ви змушені перевіряти безпеку в обох випадках. Якщо ви зберігаєте ідентифікатори у своєму веб-сеансі, ви можете вибрати, чи хочете / вам це потрібно зробити, тобто потенційно менше обробки.

Ви постійно намагаєтесь делегувати речі до вашого контролю доступу;) Це може бути у вашій заяві, але я ніколи не бачив такої послідовної системи бек-енду протягом усієї своєї кар’єри. Більшість з них мають моделі безпеки, розроблені для використання не в Інтернеті, а деякі мають додаткові ролі, додані посмертно, а деякі з них зафіксовані за межами основної моделі безпеки (тому що роль додана в іншому операційному контексті, скажімо перед Інтернетом).

Тому ми використовуємо синтетичні локальні ідентифікатори сеансу, тому що вони приховують стільки, скільки ми можемо відійти.

Існує також випуск не цілих ключових полів, що може стосуватися перерахованих значень і подібних. Ви можете спробувати переоцінити ці дані, але, швидше за все, ви опинитеся як маленькі таблички, що скидаються на бобі .


4
Цікаво, хоча я думаю, що перевірка всіх вхідних даних (включаючи параметри URL-адреси) для кожного запиту дуже підходить для Інтернету.
Оріп
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.