Як міжнародний стандарт запиту до бази даних, SQL-оператори широко використовуються в різних програмних середовищах. Як зріла та стабільна система, логін користувача та перевірка пароля є надзвичайно важливими. У своїй щоденній програмній роботі я помітив, що багато програмістів використовують SQL-оператори для перевірки паролів користувачів за допомогою такої фрази:
sql="Вибрати * з таблиці користувача, де name='"+name+"' та password='"+password+"'"
Ім'я та пароль — це імена користувачів і паролі, введені користувачем, а наведені вище твердження виконуються для перевірки того, чи є користувач і пароль легітимними та дійсними. Однак аналізом можна з'ясувати, що у наведених вище твердженнях є фатальні лазівки. Коли ми вводимо наступний рядок у ім'я користувача: 111'or'1=1, а потім випадково вводимо пароль, встановлюємо його на aaaaa. Після заміни змінної SQL-оператор стає наступним рядком:
sql="Вибрати * з таблиці користувача, де name='111'or'1=1' та password='aaaa'
Ми всі знаємо, що коли оператор select оцінює умови запиту, він ігнорує наступні операції та (and) при зустрічі з операціями або (або), а значення 1=1 у наведеному вище твердженні завжди істинне, що означає, що незалежно від значення, введеного в пароль, він може пройти вищезазначену перевірку пароля! Рішення цієї проблеми дуже просте, існує багато методів, найпоширенішим є оцінка легітимності користувача та пароля, введеного користувачем, перед перевіркою, а спеціальні символи, такі як окремі лапки та рівність, не дозволяються.
Вищезазначені проблеми, хоч і можуть здаватися простими, існують. Наприклад, рання версія відомої онлайн-гри «Smiling Proud Jianghu» в Інтернеті мала таку проблему, і автор також ретельно проаналізував деякі програми, які писав раніше, після прочитання звіту про вразливості цієї гри, і таких лазівок було багато. Це справді має привернути нашу увагу. Це також виявляє брак досвіду програмування та обізнаності про безпеку у молодих програмістів, включаючи автора. Водночас це також нагадує, що програмісти повинні повністю враховувати безпеку програми при розробці програми і не повинні бути недбалими, інакше навіть незначне упущення може призвести до серйозних наслідків.
|