Mysql
 sql >> база данни >  >> RDS >> Mysql

Как работи SQL инжекцията и как да се предпазя от нея

SQL инжекцията е злонамерено формирана SQL заявка, използвана за "объркване" на SQL база данни, за да даде нещо, което не трябва. Например, помислете за следната заявка

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

В нормален случай това ще работи. Ако изпратим „Jack“ към това, то ще върне всички потребители на име Jack. Въпреки това, ако потребител влезе, кажете "' ИЛИ ​​1=1", получената заявка ще бъде

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

Тъй като 1 винаги е равно на 1, а комбиниращата клауза е ИЛИ, това ще върне true на всеки ред, което от своя страна ще покаже ВСЕКИ ред на злонамерения потребител. Използвайки тази техника, някой може да види цялата ви база данни. Също така помислете дали някой изпрати нещо като "'; DROP TABLE users ";--, което води до

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

Което е две заявки, едната, която няма да направи нищо, а втората ще изтрие ЦЯЛАТА база данни с потребители, което води до загуба на вашите данни.

Най-добрият метод за предотвратяване на SQL инжекции е да използвате подготвени оператори. С тях изпращате заявка към SQL базата данни, която казва нещо като

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

Това позволява на базата данни да знае формата на заявката (WHERE потребителското име е равно на някаква стойност), така че няма объркване, когато се даде заявка с обикновен текст. Тогава базата данни знае да очаква една стойност и къде да я постави. След това предавате тази стойност на базата данни, която може да използва за търсене. Това също е по-добре, тъй като базата данни може да оптимизира заявката за по-бързо търсене.

Прочетете подготвените изявления, които ще обяснят това по-подробно.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Оптимизирайте while и SQL във foreach

  2. Път за обучение на MySQL

  3. Mysqli подготвеният израз num_rows връща 0, докато заявката връща по-голямо от 0

  4. SQL инжекция, която заобикаля mysql_real_escape_string()

  5. Двусмислена колона в израза INNER JOIN