Това не какво представлява SQL инжекцията. Всеки път, когато използвате параметри, които не са били дезинфекцирани във вашата SQL заявка, вие оставяте базата си данни отворена за SQL инжектиране, което може непременно да има за цел унищожаване на данни. Това може също да бъде кражба на данни или получаване на неоторизиран достъп.
Помислете за много ограничен акаунт, където всичко, което може да направи, е SELECT
. Пишете заявка за удостоверяване:
$sql = "SELECT COUNT(*) AS count
FROM users
WHERE user_id='{$_POST['user']}' AND pass='{$_POST['password'}'";
// check if returns a count of 1, if yes, log in
При нормално въвеждане очаквате заявката да изглежда така:
SELECT COUNT(*) AS count
FROM users
WHERE user_id = 'username' AND pass='********'
Което трябва да върне 1 като брой, ако и потребителското име, и пасът съвпадат. Сега нападател се опитва да влезе като администратор. Тъй като не сте дезинфекцирали въведените си данни, те изпращат $_POST['user']
като:admin'; --
. Цялата заявка става:
SELECT COUNT(*) AS count
FROM users
WHERE user_id = 'admin'; -- AND pass='********'
Всичко след --
е коментар, така че това игнорира другото условие и връща 1 независимо. Ето, вие току-що предоставихте на злонамерен потребител администраторски достъп. Така се извършват някои истински атаки. Започвате с акаунт с ниски привилегии и през дупки в сигурността се опитвате да получите достъп до повече привилегии.
Накратко, имам акаунт за цялото приложение с ограничени привилегии (напр.:без DROP
, ALTER
и т.н.) е добро. Никога не давайте на никого или на някое приложение повече привилегии, отколкото са му необходими. Но за да предотвратите SQL инжектиране, използвайте подготвени оператори
.