Toto není o čem je SQL Injection. Kdykoli ve vašem dotazu SQL použijete parametry, které nebyly sanovány, ponecháváte databázi otevřenou pro SQL injection, která nemusí mít nutně za cíl zničit data. Může to být také krádež dat nebo získání neoprávněného přístupu.
Zvažte velmi omezený účet, kde jediné, co může udělat, je SELECT
. Napíšete dotaz pro ověření:
$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
Při normálním vstupu očekáváte, že dotaz bude vypadat takto:
SELECT COUNT(*) AS count
FROM users
WHERE user_id = 'username' AND pass='********'
Což by mělo vrátit 1 jako počet, pokud se shodují uživatelské jméno i heslo. Nyní se útočník pokouší přihlásit jako admin. Protože jste své vstupy nevyčistili, odešlou $_POST['user']
jako:admin'; --
. Celý dotaz se změní na:
SELECT COUNT(*) AS count
FROM users
WHERE user_id = 'admin'; -- AND pass='********'
Vše po --
je komentář, takže to ignoruje druhou podmínku a bez ohledu na to vrátí 1. Tady to je, právě jste udělili přístup administrátora uživateli se zlými úmysly. Tak se provádějí některé skutečné útoky. Začnete s málo privilegovaným účtem a přes díry v zabezpečení se snažíte získat přístup k dalším privilegiím.
Stručně řečeno, mít účet pro celou aplikaci s omezenými oprávněními (např.:no DROP
). , ALTER
atd.) je dobrý. Nikdy nedávejte nikomu ani žádné aplikaci více oprávnění, než potřebuje. Ale abyste zabránili vkládání SQL, použijte připravené příkazy
.