Чому захист від ін'єкції SQL не є пріоритетним?


39

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

Чи є причина, чому такі типи фрагментів коду досі використовуються?


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

34
Звинувачуйте блоги. О, і W3Schools ...
Брайан Дрісколл

13
Так, абсолютно W3Schools - дивіться w3fools.com
НезадоволенняGoat

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

3
Що я бачу в багатьох відповідях, це те, що легше навчати критично зламаному PHP, ніж це навчити, ну, PHP, який критично не порушений. Ви не можете прийняти цей аргумент, і все ще стверджуєте, що PHP - це не погана мова
user16764

Відповіді:


34

Я думаю, це здебільшого через а) необізнаність б) лінь. Початківці зазвичай мало знають про введення sql, і навіть коли вони чують про нього, вони ігнорують його, оскільки це набагато простіше і простіше кодувати таким чином.


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

6
Більшість людей не дуже цікавляться ін'єкцією SQL, доки не вдаряться. Потім раптом вони задаються питанням, куди зайшли їх столи.
Джоель Етертон

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

1
Не забувайте, що відповіді є, щоб відповісти на питання. Часто саме псевдо-код (або SQL) призначений відповісти на питання, не обов'язково забезпечувати надійне і захищене рішення для копіювання та вставки (незважаючи на те, як відповідь може бути використана в реальності).
Dalin Seivewright

1
@ l0b0 Я знаю когось, хто змусив людей сприймати виправлення ін'єкцій SQL серйозно, фактично продемонструвавши атаку ін'єкції SQL проти поточного виробничого коду.
user16764

26

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

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

Це точно сузір'я проблем, що використовуються для заподіяння Perl. Як яскравий приклад розглянемо справу Метта Райт, захопленого підлітка, який мав намір надати багато корисних, добре задокументованих та простих у встановленні сценаріїв CGI ще в 90-х роках. На жаль, він нічого не розумів щодо безпеки, а також людей, які хотіли використати його речі. Результатом став архів сценаріїв Метта Райт, який був нескінченним потоком проблем безпеки для ранніх скриптів CGI. Незважаючи на такі зусилля, як http://www.scriptarchive.com/nms.html , проблема не покращилася для Perl, поки провайдери спільного хостингу не зробили PHP зручнішим, ніж будь-що інше. Це призводить до проблеми переходу з Perl на PHP.


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

2
@ZacharyK: Хіба це не винна мова за замовчуванням?
Гонки легкості з Монікою

6
@ tomalak-geretkal: Ви використовуєте слово "помилка" так, ніби це дозволяє зробити речі - це погано. Ті ж характеристики, що призводять до безлічі поганого коду, також призводять до вирішення багатьох реальних проблем. Не ясно, що це взагалі погано.
btilly

Знову "помилка": якби HTML (а точніше браузери його інтерпретували) настільки ж толерантний до помилок, як і XSL, ніколи не було б всесвітньої павутини ...
Benjol

8

На жаль, там є безліч підручників з PHP, а деякі старі книги PHP також смоктали, щоб сказати людям писати належний код (не використовуючи register_globals тощо).

До того ж, magic_quotes_gpcмаючи ввімкнення в минулому, люди не переймалися втечею, оскільки "це просто спрацювало".


4

Особисто я вважаю, що PHP простий у використанні, тому, природно, його легко використовувати.


2

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

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

Зрозуміло, ми пройшли довгий шлях від мови складання, і я думаю, що я був би набагато продуктивнішим програмуванням на більш сучасній мові, такі як PHP, Python, Ruby або Java.

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

Расмус Лердорф створив PHP у первісному вигляді ще в 1994 році, він значно розвинувся з тих пір. У своєму найсучаснішому втіленні він підтримує об'єктно-орієнтоване програмування, а також чудові рамки, такі як Symfony. PHP як мова позбавилася від своїх початкових обмежень і зросла, щоб запропонувати велику гнучкість у тому, як програмісти можуть обрати її. Ви можете використовувати його для створення 9000-лінійного сценарію коду спагетті, або ви можете використовувати його в контексті сучасних рамок MVC, таких як Symfony: це ваш вибір!

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


Я нічого не сказав про "всіх програмістів PHP".
Гонки легкості з Монікою

2

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

Так, наприклад, замість того, щоб викладати просто синтаксис, ви організовуєте курс на кшталт (Очевидно, що кроків буде більше, це лише основний приклад побудови від базових до складніших завдань, а не просто викладання синтаксису):

  1. Так ви створили основну веб-сторінку
  2. Це те, як ви змушуєте веб-сторінку витягувати дані з бази даних
  3. Так ви надсилаєте дані з веб-сторінки в базу даних
  4. Так ви переконайтеся, що правильні дані надсилаються.
  5. Так ви захищаєте свою базу даних від зловмисних даних

це більш-менш те, як мене навчали php +1
Ремі

1

Я думаю, ви знайдете подібну кількість прикладів MS SQL + ASP / ASP.NET, які так само вразливі.

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

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


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

Безумовно, у світі .NET параметризація є досить простою в наші дні і справді повинна бути "сторінкою".
Алан Б

1

Оригінальний автор PHP Расмус Лердорф у своєму сумнозвісному записі в блозі виступає за розвиток "поза рамки" . Хоча для запитів SQL він використовує PDO, тому немає ризику введення SQL. Все ще досить некрасиво і застаріло в порівнянні з сучасними структурами MVC з шарами ORM.


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

нині використання ORM не є надмірно інженерним; це стандартно. Так використовується MVC-модель.
vartec

3
@vartec: Це навряд чи «стандарт» тільки тому , що всі вівці використовують його (і, для чого це коштує, навіть не всі вівці є його використанням). Для невеликих скриптів він може легко бути більш-інжиніринг.
Гонки легкості з Монікою

1
@Tomalak: це стандарт, тому що це спосіб реалізувати чисті та стійкі проекти. "малі сценарії", як правило, зростають з часом і перетворюються на незрозумілі жахливості.
vartec

2
@vartec: Я думаю, ви неправильно зрозуміли значення "стандарт".
Гонки легкості з Монікою

1

Ви можете звинувачувати цю погану практику на самому PHP. Спадкові версії PHP (до приблизно 2006 р.) Дозволять уникнути всіх вхідних змінних GET і POST, щоб вони були придатними для інтерполяції запитів бази даних BY DEFAULT. Дивіться http://php.net/manual/en/security.magicquotes.php


2
Був час, коли це дозволить уникнути ВСІХ змінних, як якщо б вони спеціально входили в MySQL, незалежно від того, були вони чи ні . Примітка до мовних дизайнерів: коли вам доведеться реалізувати stripslashes(), ви вже зробили це неправильно.
Ден Рей

0

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


3
Вибачте, але абсолютно жоден приклад коду ніколи не повинен змішувати запити mySQL з PHP. Це просто робити це неправильно.
Райнос

1
І безвідповідально.
Легкі перегони з Монікою

-1 для most tutorial code I have written has little or no error/exception checking..
янніс

Я бачу пункт ОП. Безвідповідальність - коли роботодавець наймає хлопця, якому бракує знань про ін'єкцію SQL тощо.
Раффаел

Я вважаю, що такий підхід є виправданим, якщо ви додаєте коментарі безпосередньо до коду, що говорить "Не використовуйте це у виробництві!". Таким чином, копія / вставки не мають виправдання.
Benjol

-1

Коли я навчався PHP, я переглянув деякі ці книги PHP + MySQL, і так, я відчуваю, що це сприяє цій поганій практиці. Але я співчуваю, бо вони навчають мову , а не хороші практики програмування. Інакше де б це закінчилося?


2
Але коли ви викладаєте мову, все ж слід використовувати в своїх прикладах бажані API. Як завжди, використовуйте параметричну форму запитів SQL, можливо, із приміткою на зразок "Ніколи не думайте використовувати інтерполяцію для створення SQL замість цього. Це здається трохи простіше, але це надзвичайно схильне до вразливості безпеки".
Ян Худець,

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

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