sql >> Databáze >  >> RDS >> Mysql

Jak funguje SQL-injection a jak se proti němu mohu chránit

Injekce SQL je škodolibě vytvořený SQL dotaz používaný k "zmatení" databáze SQL tak, aby poskytla něco, co by neměla. Zvažte například následující dotaz

"SELECT * FROM `users` WHERE `username` = '$name'";

V normálním případě to bude fungovat. Pokud tomu odešleme 'Jack', vrátí všechny uživatele jménem Jack. Pokud však uživatel zadá, řekněte „' NEBO 1=1“, výsledný dotaz bude

"SELECT * FROM `users` WHERE `username` = '' OR 1=1";

Protože 1 se vždy rovná 1 a kombinační klauzule je OR, vrátí to hodnotu true na každém řádku, což zase zobrazí KAŽDÝ řádek uživateli se zlými úmysly. Pomocí této techniky může někdo zobrazit celou vaši databázi. Zvažte také, zda někdo odešle něco jako "'; DROP TABLE users ";--, což má za následek

"SELECT * FROM `users` WHERE `username` = ''; DROP TABLE `users`";--";

Což jsou dva dotazy, jeden, který nic neudělá, druhý, který smaže CELOU databázi uživatelů, což má za následek ztrátu vašich dat.

Nejlepší metodou, jak zabránit injekcím SQL, je použít připravené příkazy. Pomocí nich odešlete dotaz do databáze SQL, který říká něco jako

"SELECT * FROM `users` WHERE `username` = '?'";

To umožňuje databázi znát formát dotazu (KDE se uživatelské jméno rovná nějaké hodnotě), takže při dotazu ve formátu prostého textu nedochází k záměně. Pak databáze ví, že má očekávat jednu hodnotu a kam ji umístit. Poté tuto hodnotu předáte databázi, kterou může použít k vyhledávání. To je také lepší, protože databáze může optimalizovat dotaz pro rychlejší vyhledávání.

Přečtěte si připravená prohlášení, která to vysvětlí podrobněji.



  1. Trailing Zero

  2. Jak importovat databáze MySQL v příkazovém řádku

  3. Transparent Data Encryption (TDE) na serveru SQL Server ve skupině AlwaysOn Availability na příkladu

  4. NodeJS MySQL:měření doby provádění dotazu