Що означає Роберт К. Мартін, якщо SQL є непотрібним? [зачинено]


45

Я багато читав / переглядав вміст Роберта К. Мартіна. Я натрапив на нього, кажучи, що SQL непотрібний через твердотільні накопичувачі. Коли я шукаю інші джерела, щоб підтвердити це, я отримую купу випадкових статей, що описують різницю продуктивності SQL між жорсткими дисками та твердотільними накопичувачами (що пов'язано, але не те, що я намагаюся дослідити).

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

Я надам тут кілька посилань, щоб ви могли читати прямо з його думки:

  1. Столи бобі
  2. Лекція з чистої архітектури

По-перше, він заявляє, що SQL слід повністю видалити з системи.

Рішення. Єдине рішення. Це повністю усунути SQL з системи. Якщо двигуна SQL немає, то атак SQLi не може бути.

І хоча він говорить про заміну SQL на API, я не думаю, що він означає поставити SQL за API через цю попередню цитату і те, що він говорив раніше в статті.

Рамки не вирішують проблеми; ...

Побічна примітка: кажучи про SQL, я впевнений, що Роберт має на увазі більшість реляційних баз даних. Можливо, не всі, але більшість. У будь-якому випадку, більшість людей все одно використовують SQL. тому...

Якщо SQL не використовується для збереження даних, то що ми маємо використовувати?

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

Я також повинен відповісти на групу "але цілісність даних". Після деяких подальших досліджень Роберт каже, що ми повинні використовувати транзакційні бази даних, такі як датомічні . Потім CRUD перетворюється на CR (створювати і читати), а транзакції SQL взагалі відходять. Цілісність даних, безумовно, важлива.

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


5
@ christo8989 - "Що він означає, замінивши SQL на API?". Я інтерпретую його так, що у вас немає текстової мови запитів (яка передається SQL-механізму) у всій вашій базі коду. Ви ховаєте це за API, який відкриває лише безпечні механізми для опису запитів. Внутрішній інтерфейс API щось повинен генерувати команди для SQL-двигуна, але це менша площа поверхні, в якій можна примусити використовувати прив'язку параметрів тощо, контролювати, хто вносить зміни тощо.
andrew

42
Але, але, але ... SQL - це API. Це API для RDBMS. Це просто відбувається дуже потужний API, який можна легко використати.
Барт ван Інген Шенау

25
При створенні API DB , який не має текстовий інтерфейс, рано чи пізно якийсь - то бідний програміст буде писати код , який виглядає наступним чином : eval(request.GET["table_name"] + ".get(pk=" + request.GET["pk"] + ")")). Виною насправді не SQL, а бідні, неосвічені програмісти.
Лежати Райан

6
@JimmyJames SQL - це так, але це не означає, що це не API. SQL - це мова, яка надає API для доступу до деяких базових сховищ.
Кубічний

5
@nocomprende SQL завжди розроблявся для використання в додатках. Інакше це було б практично марно. Сенс завжди полягав у тому, щоб надати додаткам певний спосіб зберігання та отримання даних, не возившись із дивними користувацькими форматами або навіть не піклуючись про те, як зберігаються дані.
Кубічний

Відповіді:


74

Боб Мартін явно перебільшує, щоб зробити його більш зрозумілим. Але в чому його суть?

Чи він просто хоче, щоб люди припинили використовувати SQL / реляційні бази даних через атаки SQLi?

Наскільки я розумію, у цій публікації блогу (ваше перше посилання) Мартін намагається переконати людей припинити використання SQL, але не реляційних баз даних. Це дві різні речі .

SQL - надзвичайно потужна мова, і вона певною мірою стандартизована. Це дозволяє створювати складні запити та команди дуже компактно, у читаному, зрозумілому, легкому для засвоєння вигляді. Це не залежить від іншої мови програмування, тому він може бути використаний для більшості програмістів додатків, незалежно від того, чи віддають вони перевагу Java, C, C ++, C #, Python, Ruby, JavaScript, Basic, Go, Perl, PHP або щось інше.

Однак ця сила приходить до витрат : писати безпечні запити / команди SQL важче, ніж писати небезпечні. Безпечний API повинен спрощувати створення безпечних запитів "за замовчуванням". Потенційно небезпечним особам потрібно більше розумових або, принаймні, більше зусиль для друку. Це IMHO, чому Мартін рентує проти SQL в його нинішньому вигляді.

Проблема не нова, і для доступу до реляційної бази даних є безпечніші API, ніж стандартні SQL. Наприклад, усі АБО картографи, яких я знаю, намагаються надати такий API (хоча вони, як правило, розроблені для інших основних цілей). Статичні варіанти SQL ускладнюють створення будь-яких динамічних запитів із несанітизованими вхідними даними (і це не новий винахід. Вбудованому SQL, який часто використовує статичний SQL, близько 30 років).

На жаль, я не знаю жодного API, який би настільки гнучкий, стандартизований, зрілий, незалежний від мови, а також такий потужний, як SQL, особливо динамічний SQL. Тому я маю певні сумніви щодо пропозиції Мартіна "не використовувати SQL" як реалістичний спосіб вирішення згаданих проблем. Тому читайте його статтю як думку в правильному напрямку, а не як "найкращу практику", яку ви можете сліпо слідувати з завтрашнього дня.


2
Принаймні, ми можемо уникати використання його для будь-якої операції написання, як правило, з тим, що надає ORM-подібний матеріал. Що стосується запитів до бази даних, то ви вже можете робити якісь речі без написання власного SQL. Сьогодні лише "розширене" використання можливостей бази даних повинно вимагати написання SQL або використання складного типу даних (графік, географічні дані, рекурсивний).
Вальфрат

7
Мартін конкретно стверджує, що API, що використовується, не повинен бути таким потужним, як SQL; Його аргумент, що сила SQL - це проблема, а не особливість. API, про який він стверджує, повинен бути специфічним для програми та бути таким же гнучким та потужним, як абсолютно потрібне додатку, не більше. Він спеціально заперечує проти вигадування іншої мови запитів на основі рядків.
Кубічний

3
@Cubic: будь-яке рішення проблем, згаданих Мартіном, мабуть, має бути менш потужним або менш простим у використанні, ніж SQL - це їх благо і прокляття.
Док Браун

1
@Barmar: SQL приблизно настільки високого рівня, як ви можете отримати, і Боб стверджує, що він очевидно небезпечний.
Роберт Харві

3
@ christo8989: Я не думаю, що буде багато сенсу намагатися написати одну відповідь як відповідь на все те, що Мартін колись писав чи сказав у своїй кар’єрі. Моя відповідь була однією з питань, що даються у вашій назві, пояснюючи здебільшого, як публікація блогу у першому посиланні, яке ви дали, якщо ІМХО трактуватиметься.
Док Браун

57

Думка Боб Мартіна - саме це; думка однієї людини.

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

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

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

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


16
Статті Мартіна я не трактую як відмову від відмови від RDBMS, а скоріше використовую альтернативні способи взаємодії з ними, наприклад, LINQ-SQL або API критеріїв JPA, а не безпосередньо кодую чи маніпулюючи рядками SQL у нашому вихідному коді.
Жуль

27
Тож ми не повинні сліпо слідувати тому, що він говорить ... але що він говорить ?
TRiG

33
Одне, що мені дуже не подобається у спільноті, - це коли ви ставите запитання про те, щоб зробити щось «Чистий кодекс / дядько Боб-дорога» , - це люди, котрі розмовляють, щоб сказати вам, як вам робити щось інше . "Як малювати як Ван Гога?" - "Ван Гог помилявся, замість цього слід малювати як Пікассо".
Р. Шмітц

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

17
Вся технологія приречена і по суті хибна. Це лише питання часу. Тим часом у нас є речі, які нам потрібно робити, за допомогою наших недосконалих і приречених технологій.

15

Що він насправді каже?

Він говорить, чи замінити SQL технологіями No-SQL?

TL; DR: Так (свого роду)

У нещодавньому розмові, ніж той, з яким ви пов'язувались на тій же темі, він говорить: "База даних - це деталь. Чому у нас є бази даних?" .

Він стверджує, що база даних стала спрощувати доступ до даних із спінінг-дисків, але в майбутньому "[...] не буде дисків" завдяки новій технології і тому, що він називає "стійкою ОЗУ", і що це буде простіше зберігати дані за допомогою структур, які використовують програмісти, наприклад хеш-таблиць або дерев.

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

Якби я був Oracle, я б дуже злякався, бо причина мого існування випаровується з-під мене. [...] Причина існування бази даних зникає.

Напевно, будуть якісь реляційні таблиці, які виживають, але зараз є якась здорова конкуренція .

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


Примітка автора:

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


2
"Постійна ОЗУ", здавалося б, стосується лише використання баз даних для серіалізації поточного стану програми, але не враховуючи сумісності вперед або назад. Звичайно, деякі бази даних використовуються саме так, але далеко не всі (я розумію, що це говорить Мартін, а не ви).
Кубік

7
Тож Мартін насправді каже, що єдиним моментом баз даних є абстрагування над повільним зберіганням? Ого. Тоді це підтримує відповідь Роберта Харві: Його думку слід сприймати з величезним зерном солі. Наприклад, ця точка зору не враховує, що значення БД підтримує послідовну та стійку модель даних. Його уявлення про структуру даних у "стійкій оперативній пам'яті" (SSD?) Є повільною і відкриває можливість втрати даних, навіть БД NoSQL часто використовують журнальні та незмінні структури даних для безпечного оновлення стійких записів.
амон

3
@amon Так, Роберт Харві має рацію, пропонуючи більш диференційовану точку зору. Але оскільки ОП запитав конкретно про те, що намагається сказати Роберт К. Мартін, я переписав частину його "новішої" розмови.
Søren D. Ptæus

3
@amon - див. перше речення відповіді Дока Брауна вище. Мартін часто висловлює заяви, що є масовими перебільшеннями його точки зору, щоб переконатись у цьому. Він не означає, що всі операції з базою даних можуть бути замінені сховищами пам’яті. Більше, ніж він означає, що просто наявність компонента вашої програми, який торкається SQL в якійсь формі, є достатньо масовим ризиком безпеки, якого слід уникати у всіх випадків, але на обличчі його слів він може бути витлумачений як таке. Але все, що він насправді намагається зробити, це змусити всіх зупинитися і подумати: чи правильно SQL / RDBMS підходить для моєї програми?
Жуль

12
@Jules Я розумію, що він часто перебільшує. Але з огляду на його охоплення та репутацію, зовсім не корисно, що «дядько Боб» не дає зрозуміти, коли він перебільшує і де він насправді говорить, що має на увазі. Якщо він повинен щось навчати, не можна вдвічі здогадуватися і переосмислювати все, що він говорить, поки це не має сенсу , тим більше, що він сам не відображає і не критикує свої ідеї. У якийсь момент простіше сказати «не слухайте його» або навіть: дядько Боб вважав шкідливим .
амон

11

SQL - деталь. Знання деталі не повинно поширюватися.

Оскільки SQL використовується все більше і більше місць у вашому коді, ваш код стає все більш і більш залежним від нього.

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

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

Однією з речей, яка робить Java такою портативною, є те, що певні функції процесора просто недоступні. Якби вони були в наявності, я б використовував їх. І раптом з’являються процесори, на яких мій код Java не буде працювати, оскільки вони не мають цих функцій. Так само і з функціями бази даних.

Все легко пожертвувати своєю незалежністю, не усвідомлюючи цього. SQL - це вибір не даний. Якщо ви приймаєте рішення використовувати SQL, тоді зробіть його в одному місці. Зробіть це таким чином, що його можна не вишити.

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


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

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


1
Гоше, Ейнштейн, звичайно.

1
Ах, не знав, що Ейнштейн знав Боба. Або що Боб був Богом. Хоча це звучить, ніби він створює кумедний розрядний біт.
candied_orange

9
@nocomprende Ви живете на постійній дієті мотиваційних плакатів?
candied_orange

2
Але Боб - це Бог. Для деяких принаймні.
Пітер Мортенсен

3
Я відмовляюся вірити, що Бог такий хороший у публічних виступах.
candied_orange

5

Цитата з вашої першої цитати є (моє наголос),

Рішення. Єдине рішення. Це повністю усунути SQL з системи . Якщо двигуна SQL немає, то атак SQLi не може бути.

Що замінить SQL? API звичайно! І НЕ API, який використовує текстову мову. Натомість API, який використовує відповідний набір структур даних та функціонує викликів для доступу до необхідних даних.

Противодиться проти того, щоб програмісти прикладних програм могли використовувати SQL.

Запропонований виправлення полягає в тому, щоб дозволити їм використовувати замість цього API: який не є SQL і не дозволяє вводити ін'єкції.

ІМО, приклади таких API можуть включати:

  • http://bobby-tables.com/csharp пропонує програмістам C # використовувати API ADO.NET.

    Це не ідеальний приклад, тому що ADO.NET - це широкий або глибокий (тобто потужний або загального призначення) API, який також дозволяє своїм користувачам вводити необроблений (або необроблений) SQL.

  • Деякі розробники SQL або адміністратори бази даних пропонують налаштувати базу даних таким чином, щоб вона дозволяла отримувати доступ лише через (обмежену кількість кваліфіковано написаних) збережених процедур , і що розробникам додатків не слід дозволяти писати власні (небезпечні) запити SQL

  • Інший спосіб "усунути SQL з системи" - це розмістити базу даних (яка відкриває SQL) в іншій системі, до якої можна отримати доступ через REST API або подібну.

Отже, IMO, загальне рішення або система [и] все ще можуть використовувати базу даних (особливо з огляду на те, що двигун бази даних реалізує корисні властивості ACID, добре масштабує і так далі, можливо, буде нерозумно намагатися обійтися без одного або написати специфічний для програми).

Вимоги ранту задовольняються, якщо API SQL бази даних прихований від розробників додатків, за деяким іншим API (наприклад, ADO, можливо, ORM, веб-сервіс чи інше).

Загалом, я вважаю, що це означає наявність певного додатка (DAL) ("рівень доступу до даних" або "рівень абстракції бази даних"). DAL ізолює додаток від деталей того, як і де зберігаються та / або отримуються дані. DAL може бути або не може бути реалізований за допомогою бази даних SQL.


Я працював над продуктом, який робив саме це 30 років тому. І базова база даних навіть не підтримувала SQL (поки що). І набір пов’язаних таблиць зберігався у базі даних (чекайте цього ...). Хлопець, який придумав це, був справді розумний. Хоча більше не програміст.

Мені подобається ця відповідь, але я думаю, що він може цього не сказати. Він також заявляє: "Рамки не вирішують питання ...". З вашої відповіді здається, що ви говорите, що з використанням Linq-to-Sql все в порядку, але хіба це не рамка, яка вирішує проблему?
christo8989

@ christo8989 Я не знаю. Він згадує сплячку як приклад структури, яка не може вирішити цю проблему. І справді OWASP каже : "Зимова сплячка не дає імунітету ін'єкціям SQL. Ви можете зловживати api як завгодно. Немає нічого особливого в HQL (підмножина Hibernates в SQL), що робить його більш-менш сприйнятливим". В той час, як деякі з API, про які я згадував, були б кращими ізоляторами, не піддаючи SQL взагалі. Можливо, сплячий режим - це те, що ви можете використовувати для впровадження дозволу DAL (але це не є повноцінним DAL).
ChrisW

1
@ christo8989 augustl.com/blog/2016/… припускає, що Datomic є (просто) ще однією обгорткою / шаром навколо (можливо, SQL) бази даних - "Datomic не пише безпосередньо у файлову систему. Натомість ви можете використовувати номер різних баз даних як резервний пристрій для зберігання даних Datomic: будь-яка база даних SQL JDBC тощо "
ChrisW

Слід зазначити, що рішення для уникнення ін'єкції SQL в ADO.NET не все складне - використовуйте заповнювачі в SQL, використовуйте параметри в команді та встановлюйте значення зазначених параметрів.
Зев Шпіц

3

Здається, всі відповідають на це питання з точки зору безпеки або за допомогою об'єктива SQL.

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

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


Що він може подумати про одночасне читання / запис даних для багатьох користувачів?
ChrisW

1
@ChrisW Я не думаю, що це питання впровадження, а не ідея високого рівня, як знайти спосіб покращити постійне зберігання даних.
Кінан

@ChrisW Він також розповідає про транзакційні бази даних. Розміщення технології управління джерелами як ваш інструмент збереження. При цьому ви лише створюєте та читаєте, що є набагато більш одночасним, ніж транзакції та оновлення.
christo8989

@Keenan Тож він насправді не пропонує рішення через впровадження. Він просто каже, подумайте, що може бути?
christo8989

1
@ christo8989 Чи особисто він очолював відданість кандидатських рішень для постійної проблеми зберігання в галузі інформатики, я не знаю. Це виходить за межі питання ОП. Дядько Боб все стосується архітектури плагінів. Нинішній галузевий стандарт розробки додатків тісно пов'язаний з базою даних та побудовою програми навколо неї, додаток залежить від db, коли db повинен залежати від додатка. Швидше дядько Боб пропонує, що "база даних є детальною інформацією", і її слід відокремити і замінити.
Кінан

2

Насправді він не повинен використовувати бази даних і SQL - досить явно. Перша посилання - це добре відома проблема, друга посилання звучить як звук. Хоча, я трактую це як є вагомий привід використовувати бази даних і не використовувати SQL. З моєї точки зору, це навіть не розумні поради.

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

    my $sql="select a from b where a=$ui_val;";
    prepare($sql)
    execute($sql)

на відміну від

    my $sql="select a from b where a=?;";
    prepare($sql)
    execute($sql,$ui_val);

Це схожий приклад DBI для коду рубіну на рейках. Код рейки, який він надає, легко переплутати між безпечним і небезпечним. Як і багато ORM, приховує, що знаходиться під SQL, і тому часто ви маєте справу з інтерфейсом, який створює та виконує sql для вас. Це не схоже на те, що API робив би для вас?

Моя інтерпретація першої посилання полягає в тому, що він пропонує нам замінити добре відоме питання, яке має добре відоме рішення.

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

Він частково правильний, зрештою у нас буде нескінченно велика і швидка пам'ять і нескінченно швидкий процесор. Поки ми не вислизнемо з поточної фізики, яка стримує обчислення, він не є правильним.

Так, прядильний диск - це минуле, і зараз ми використовуємо SSD. Диски працюють з приблизно ~ 10 мілісекундами на передачу даних, SSD - з ~ 0,5 мілісекундами (500 мікросекунд) час доступу до даних. Оперативна пам’ять становить близько 100 наносекунд, процесори працюють на коефіцієнті 100s пікосекунди. Це серце, чому нам потрібні бази даних. Бази даних управляють передачею даних між прядильними дисками або SSD з основною пам'яттю. Поява SSD не усунула необхідності в базах даних.


4
"ВИКОРИСТАННЯ ВИКОРИСТАННЯ SQL" (цитується з першого посилання), мені дуже зрозуміло, що він говорить, щоб не використовувати SQL.
Doc Brown

6
Це питання порядку слів. Насправді це спочатку була телеграма: ВИКОРИСТАННЯ SQL STOP

6
@nocomprende Так ви кажете, що він жертва перегонів? Ну, ой. Він міг уникнути цього, використовуючи транзакції SQL.
Конрад Рудольф

Можливо, це дуже коротка суміш Visual Basic і Fortran. Де це все закінчиться?

1
@KonradRudolph: Ну, я думаю, ми погодимось, що практично ніхто не буде використовувати TSX прямо з монтажу. Будуть абстракції вищого рівня. Чи будуть ці абстрактні транзакції транзакціїми SQL? Я думаю, що не. Як інтерпретована мова, SQL несе ефективність роботи. Це насправді не мало значення, коли ви зверталися до даних про обертові жорсткі диски. Однак це недоступно під час доступу до даних в оперативній пам'яті.
MSalters

2

Відповідь

він просто хоче, щоб люди припинили використовувати SQL / реляційні бази даних через атаки SQLi?

Стаття "Столи Бобі", здається, дозволяє припустити, що це, саме по собі, є причиною не використовувати SQL:

Рішення. Єдине рішення. Це повністю усунути SQL з системи. Якщо двигуна SQL немає, то атак SQLi не може бути.

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

Відступ

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

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

Що стосується того, що ін'єкція SQL є аргументом для використання SQL, це смішно. Це добре зрозуміла проблема з досить простим рішенням. Проблема цього аргументу полягає в тому, що SQLi - не єдина вразливість. Якщо ви думаєте, що використання API JSON робить вас безпечним, вас чекає великий сюрприз.

Думаю, кожен розробник повинен переглянути це відео під назвою "П’ятниця 13 числа: Атака JSON - Альваро Муньос та Олександр Мірош - AppSecUSA 2017"

Якщо у вас немає часу або нахилу переглядати це, ось суть: у багатьох бібліотек десеріалізації JSON є вразливі місця виконання коду. Якщо ви використовуєте XML, вам доведеться ще більше турбуватися. Заборона SQL у вашій архітектурі не зробить вашу систему захищеною.


Ніхто не стверджував, що заборона SQL сама по собі зробить вашу систему безпечною. Дядько Боб стверджує, що це робить вашу систему більш захищеною, і, враховуючи, що інжекція SQL залишається найбільшим ризиком у безпеці веб-додатків вже більше десяти років, я думаю, ви не повинні з легкістю відкидати необхідність галузі вдосконалювати спосіб спілкування з базами даних .
Мерітон - страйк

@meriton Вибачте, але "рішення, єдине рішення" видається досить зрозумілим. Рішення проблеми SQLi відоме і досить просте. Люди, які не можуть заважати використовувати підготовку висловлювань, збираються створити незахищені системи незалежно від того, припиняють вони використовувати SQL. Це непрофесійні люди, яким потрібно почати дотримуватися основних передових практик або отримати нову роботу.
JimmyJames

2

Я хочу звернутися лише до короткої заяви:

Або він просто хоче, щоб люди перестали використовувати SQL / реляційні бази даних через атаки SQLi?

Ні. Це неправильне припущення. Ми не можемо сказати, що ми повинні припинити користуватися автомобілями, адже вони несуть відповідальність за людей, які загинули в автомобільних аваріях. Таким же чином, бази даних SQL / реляційні (або що-небудь інше в цьому контексті, наприклад RDBMS) не несуть відповідальності за зловмисне навантаження SQL, яке зловмисник може виконувати у вашому веб-додатку. Я впевнений, що автор цього не мав на увазі, оскільки для цього існує ціла табличка читів для запобігання ін'єкцій SQL .


2
Автоматизовані машини запобігли б близько 98% ДТП. Ми повинні довіряти машині більш , хе - хе - хе.

3
"Ми не можемо сказати, що ми повинні припинити користуватися автомобілями (за винятком особливих та / або ретельно контрольованих обставин], оскільки вони несуть відповідальність за людей, які загинули в автомобільних аваріях". - Ум. Ми можемо абсолютно сказати це. І багато розумних людей це роблять.
Конрад Рудольф

1
Ви в основному говорите: Додаток, розроблений на Java, зламаний, тому ми повинні припинити використання Java . Схиляння схилень достатньо, і для решти я не для того, щоб навчити вас здоровому глузду. @KonradRudolph
Billal Begueradj

2
@BillalBEGUERADJ Це дещо помилкова еквівалентність (оскільки від злому нічого не є безпечним), але це також не зовсім далеко: є мови, які, на баланс, не повинні використовуватися, оскільки є кращі альтернативи; наприклад, якщо ви використовуєте C поза контекстом системного програмування, ви робите це неправильно. У всякому разі, я не downvote своєї відповіді , але це не так: тому , що попри те , що ви стверджуєте, що це саме те, що говорить Боб Мартін (як показують інші відповіді).
Конрад Рудольф

2

Мабуть, проблема Мартіна полягає в тому, що програмісти будують динамічний SQL безпосередньо з введення користувача, щось на зразок (вибачте, я в першу чергу програміст C і C ++):

sprintf( query, "select foo from bar where %s;", user_input );

що абсолютно рецепт печії (звідси смужка " Боббі Столи" ). Будь-який програміст, який вводить подібний код у виробничу систему, заслуговує на подряд.

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

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

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


Хоча sprintfне містить таку санітарну обробку, якої вимагає SQL, функції, розроблені спеціально для цієї мети , і є абсолютно безпечними. Приклад: SqlQuery в Entity Framework .
Роберт Харві

@RobertHarvey: Я б припустив, що це так. Зі свого боку, я здебільшого займаюсь серверною роботою на C та C ++, тому я все ще час від часу бачу (на щастя рідкісні) приклади людей, які просто sprintfдіють динамічний SQL, а це не так, як ти це робиш.
Джон Боде

1

Два джерела, з якими ви посилаєтеся, передають різні повідомлення:

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

Лекція різна. Перша різниця полягає в тонусі: Лекція розмірковує і ставить під сумнів, але не засуджує. Він не каже, що бази даних є злими, але закликає нас уявити стійкість без бази даних. Він стверджує, що за 30 років з моменту поширення реляційних баз даних багато речей змінилося, і виділяє два, які, можливо, вплинуть на наш вибір технології збереження:

  • простір для зберігання збільшився приблизно в 1 мільйон - за порівнянними цінами! Отже, зберігати сховище потрібно менше, а зокрема видаляти його більше не потрібно. Використовуючи сховище лише для додавання, контроль сумісності можна спростити, оскільки блокування читання непотрібне. Це може уникнути потреби в транзакціях.
  • Час доступу зменшився, тому що більшість наборів даних зараз поміщаються в оперативну пам’ять, масово скорочуючи затримку читання.

Чи змінюються ці змінені обставини оптимальної технології збереження? Цікаво, що дядько Боб не каже - мабуть тому, що він вважає, що відповідь не буде правильною для всіх програм. Ось чому він застерігає нас ставитися до вибору технології збереження, як до деталей, а не до закріплення її в кам'яних табличках і передавати її як отриману мудрість нашим ровесникам.

Чи існують альтернативи?

Запис логіки доступу до даних без рядків цілком можливо. У землі Java ви можете використовувати QueryDSL , де запити описуються за допомогою безпечного для API типу, що створюється на основі схеми вашої бази даних. Такий запит може виглядати наступним чином:

JPAQuery<?> query = new JPAQuery<Void>(entityManager);
Customer bob = query.select(customer)
  .from(customer)
  .where(customer.firstName.eq("Bob"))
  .fetchOne();

Як бачимо, логіка запиту не виражається як String, чітко відокремлюючи довірену структуру запиту від ненадійних параметрів (і звичайно, QueryDSL ніколи не включає параметри в текст запиту, але використовує підготовлені оператори для розділення запиту. для його параметрів на рівні JDBC). Щоб досягти ін'єкції SQL за допомогою QueryDSL, вам доведеться написати власний аналізатор, щоб розібрати рядок і перекласти його в синтаксичне дерево, і навіть якби ви це зробили, ви, ймовірно, не додали б підтримку таких неприємних речей, як select ... into file. Коротше кажучи, QueryDSL робить неможливим введення SQL-ін'єкцій, а також покращує продуктивність програміста та підвищує безпеку рефакторингу. Попереджений найбільший ризик для безпеки веб-додатків, який існує досить довго, щоб нерестувати запущені пробілкита підвищили продуктивність розробників? Смію сказати, що якщо ви все ще пишете запити як рядки, ви робите це неправильно.

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

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