sql >> Databasteknik >  >> RDS >> Mysql

Hur fungerar SQL-injektion och hur skyddar jag mig mot det

En SQL-injektion är en uppsåtligt skapad SQL-fråga som används för att "förvirra" en SQL-databas till att ge något den inte borde. Tänk till exempel på följande fråga

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

I ett normalt fall kommer detta att fungera. Om vi ​​skickar in "Jack" till detta kommer det att returnera alla användare som heter Jack. Men om en användare går in, säg "' ELLER 1=1", blir den resulterande frågan

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

Eftersom 1 alltid är lika med 1, och kombinationssatsen är OR, kommer detta att returnera sant på varje rad, vilket i sin tur visar VARJE rad för den illvilliga användaren. Med den här tekniken kan någon se hela din databas. Tänk också på om någon skickar något som "'; SLIP TABELL users ";--, vilket resulterar i

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

Vilket är två frågor, en som inte gör någonting, den andra som raderar HELA användardatabasen, vilket resulterar i att dina data går förlorade.

Den bästa metoden för att förhindra SQL-injektioner är att använda förberedda satser. Med dessa skickar du en fråga till SQL-databasen som säger något i stil med

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

Detta låter databasen veta formatet på frågan (VAR användarnamn är lika med något värde), så det uppstår ingen förvirring när en fråga med vanlig text ges. Då vet databasen att förvänta sig ett värde och var den ska placeras. Sedan skickar du det värdet till databasen som den kan använda för att söka. Detta är också bättre eftersom databasen kan optimera frågan för snabbare sökning.

Läs upp förberedda uttalanden, som kommer att förklara detta mer i detalj.



  1. Kryptera lösenord i R - för att ansluta till en Oracle DB med RODBC

  2. Hämta alla nyheter och alla kommentarer

  3. 3 sätt att lista alla funktioner i PostgreSQL

  4. Viloläge Skapa kriterier för att gå med i samma tabell två gånger - försökte 2 tillvägagångssätt med 2 skillnadsfel