Невже затемнення / затьмарювання ідентифікаторів даних, що стоять перед громадськістю, справді є «найкращою практикою»?


23

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

EDIT : Звичайно, зараз, коли я це запитую, я знаходжу деякі ресурси на цю тему:

Ці посилання задовольнили деяку мою цікавість, але публікації ЗП не мають багато голосів і не обов'язково зосереджені навколо цієї теми в цьому контексті, тому я не впевнений, що з цим зробити, і деякі з них стверджують, що третій посилання хибна. Решту своєї публікації я залишу недоторканою:


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

Чи є до цього правда, це просто параноїя, або це взагалі просто неправда?

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

Це дійсно вважається "найкращою практикою" чи це лише мікрооптимізація малоцінного?

ПРИМІТКА : Я думаю, що у кількох людей, можливо, з’явилася помилкова думка: я не припускаю, що важко здогадатися ідентифікатори будуть єдиним механізмом захисту, очевидно, були б звичайні перевірки доступу. Припустимо, що вони є на місці, і що просто знати id або хеш-код запису недостатньо для надання доступу.

Відповіді:


28

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

Наприклад, якщо ви мали б виставити ідентифікатор замовлення, який генерується послідовно, і у вас сталася атака соціального інженерія, коли хтось телефонував у службу підтримки та каже: "Ей, я щойно витратив $ 2000 на новий комп'ютер, а ви, хлопці, надіслали мені замовлення іншого хлопця на кабель у розмірі 15 доларів, зараз я витратив 2000 доларів ", ви могли витратити багато часу, намагаючись перевірити проблему, перш ніж ви або укладете, що це нечітка помилка, або ви надішлете факеру новий комп'ютер.

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

У таких випадках, якщо цифри не є послідовними, експозиція трохи пом'якшується, оскільки здогадки мають меншу ймовірність отримати цікаві результати. З іншого боку, тепер вам потрібен зручний спосіб посилатися на ідентифікатор замовлення у взаємодії з підтримкою клієнтів, що не призведе до тривалих зворотних розмов із телефонними взаємодіями з клієнтами, в той час як ваш представник намагається розрізнити B, PD та T в порядку замовлення BPT2015D.

Я б сказав, що це розтягнення називати цю омертвіння "найкращою практикою", але в певних сценаріях це може зменшити простоту використання чергової слабкості у вашій валідації чи авторизаційному коді. З іншого боку, насправді не важливо, чи знає хтось, що ви написали допис у блозі №1 чи №2559. Якщо ідентифікатор не є цінною інформацією, навіть з додатковими знаннями, то аргумент про те, що це обманювання - це найкраща практика, має меншу вагу.

Є другий потенційний аргумент, який полягає в тому, що ідентифікатор вашої бази даних може вивести вас за певну реалізацію бази даних (або екземпляр), і коли ваша компанія викуповується або бере конкурента, і тепер вам доведеться об'єднати дві застарілі системи або генерального директора виходить пити з представником від DynoCoreBase, і вони вирішують, що тепер ви перемістите всі свої дані до DynoCoreBase версії 13h, і він хоче, щоб усі основні ключі були орієнтирами, і вам доведеться створити якийсь шар відображення для перекладу старих ідентифікаторів у нові Ідентифікатори, щоб старі URL-адреси не зламалися, але чи важливі ці сценарії для вас, набагато більше залежить від характеру вашого бізнесу (і залучення клієнтів до цих ідентифікаторів), ніж від будь-якої загальної найкращої практики.


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

9

Це мій погляд на це:

Хоча «безпека через незрозумілість» очевидно недостатня, незрозумілість може сприяти безпеці, навіть якщо вона небагато. Ви повинні вирішити, чи варто цього небагато psuedo-безпеки докласти додаткових зусиль, необхідних для розгортання чогось подібного у вашій програмі.

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

Конфіденційність

Скажімо, ми маємо справу з ідентифікаторами користувачів у URL-адресі. Якщо ідентифікатор користувача Джо, а ідентифікатор користувача 100Боб - 101це, мабуть, очевидно, що обліковий запис Джо було створено першим. Хоча це може не мати значення для більшості програм, для деяких це може мати значення. Це приклад конфіденційності, суворо через невідомість, тому, якщо у вас не дуже складна система обдумування ідентифікаторів користувачів, це може бути досить легко розчинити і з'ясувати, якщо у користувача з ідентифікатором 3Js9kW3hTs7sa120є обліковий запис довший, ніж у користувача з ідентифікатором Q8Hs73kks0hEg.

За посиланням, на яке я посилався:

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

Використовуючи ідентифікатор автоматичного збільшення, відкрито розкриває кількість об'єктів у базі даних та може викрити, які з них були створені першими та які нові. Ця інформація може призвести до того, що бізнес є новим або не працює навіть добре. Наприклад: скажімо, ви замовляєте книгу, і ваш номер замовлення 1. Можливо, очевидно, що ваше замовлення було першим у системі, що може бути непосильним. Скажімо, ви повертаєтесь і замовляєте інше, і ваш ідентифікатор замовлення 9. Це дає інформацію про те, що лише 7 замовлень було розміщено у часові рамки між вашими двома замовленнями. Це може бути цінною інформацією для конкурентів. У цьому випадку числовий ідентифікатор автоматичного збільшення, ймовірно, буде краще затуманений.


2

Слово "Неясне" тут, мабуть, трохи вводить в оману, і, можливо, змусить людей думати "притупляти" або "частково приховувати".

Рекомендація полягає в тому, щоб ви ніколи не включали будь-які внутрішньо генеровані ключі бази даних як частину загальнодоступної URL-адреси, якщо ці записи бази даних містять будь-які конфіденційні дані.

Просто занадто просто грати з числами в URL-адресі та отримувати доступ до інших записів.


1
Так, я мав на увазі затуманення в заголовку та декількох інших випадках - вибачте за це. Радий, що ти знаєш, що я мав на увазі. Я розумію, що "грати з цифрами", але це якраз моя думка - ваш додаток не слід захищати, роблячи ідентифікатори трохи складніше відгадати і схрещувати пальці. Якщо хтось приземлився, /account/8hdy39s1lks062dfasd4і він відображає справжній рахунок, він ніколи не повинен мати доступу.
Веслі Мерч

2

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

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

Але він має пару переваг перед звичайною паролем імені користувача та паролем. По-перше, у користувача немає вибору щодо цього, тому ви можете бути впевнені, що по суті неможливо здогадатися. Немає сенсу створювати ідеально безпечний сайт, коли адміністратор вибирає своє ім’я як пароль. По-друге, кожен елемент має інший ідентифікатор, тому якщо один отримує доступ до одного елемента, це не допомагає іншому.

Звичайно, чим більше шарів безпеки, тим краще. Але тільки цей метод може бути більш безпечним, ніж пара даних.


1
Я згоден. Який би спосіб захисту ви не використовували, справа зводиться до надсилання непередумних байтів по дроту. Якщо все зроблено правильно, ви надсилаєте ідентифікатор, такий же хороший, як і зашифрований, який не просочує жодної інформації про ваш простір ідентифікаторів, і я заперечу, що це сильніше, ніж те, про що люди говорять, коли вони захищають "безпеку через незрозумілість. "
Марк Стобер

0

Для цього є два аспекти: зручність використання та безпека.

Захисні посвідчення особи з точки зору безпеки досить безглузді; що важливо, це те, що ідентифікатор ніколи не повинен бути єдиним «ключем» до будь-якого недержавного ресурсу. Це означає, що якщо ви хочете надати вибраним користувачам доступ до певної сторінки, просто вимагається ідентифікатор сторінки в URL-адресі недостатньо, вам доведеться реалізувати власне механізм захисту, такий як логін користувача / пароля або автентифікація відкритого / приватного ключа, а також належна авторизація (тобто система повинна бути спроможна оцінювати за кожним випадком, чи може користувач X отримати доступ до ресурсу Y, і діяти відповідно).

Загальна порада полягає в тому, щоб зберігати штучні ключі прихованими: вони не мають ніякого значення для користувача, і виявляючи їх очевидними способами, ви вводите додаткову залежність, яку особливо важко впоратися, бо вона живе поза сфера програмного забезпечення - люди будуть записувати, електронну пошту, факс, друк, закладки і т.д., ті ідентифікатори, і якщо ви коли - небудь змінити їх, ви для деяких дратівливих квитків підтримки.


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

@Madmartigan: Це не так вже й рідко з користувацькими інформаційними системами. Користувачам потрібно робити певні дії, а іноді додаток не дуже підтримує їх безпосередньо, або він просто розбитий, або, можливо, пройти через ідентифікатори безпосередньо простіше, ніж пройти маршрут, який планували архітектори програмного забезпечення. Люди можуть бути дуже креативними з цими речами, і перш ніж ви знаєте, ті "внутрішні" посвідчення особи починають вести власне життя.
tdammers

0

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

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

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


2
Я думаю, що ви, можливо, помилилися з думкою, я не пропонував "дозволити доступ до довільних ресурсів, лише знаючи їх внутрішній ідентифікатор", я говорю про придушення ідентифікатора на основі існуючих заходів безпеки. Очевидно, що просто знати id чи хеш не слід вважати авторизацією.
Веслі Мерч

0

Очевидно, це залежить від того, наскільки чутливі дані, але для середньої безпеки я б мінімум включив ідентифікатор та значення контрольної суми.

Створіть контрольну суму, додавши сіль (тобто набір збірних випадкових символів) до і після ідентифікатора та виконуючи MD5 за значенням.

На кожній сторінці, що читає значення ID, вона повинна генерувати значення контрольної суми та порівнювати її з попередньо переданою, відмовляйте у запиті, якщо вона не відповідає.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.