Sök…


Introduktion

SQL-injektion är ett försök att få tillgång till en webbplatss databastabeller genom att injicera SQL i ett formulärfält. Om en webbserver inte skyddar mot SQL-injektionsattacker kan en hacker lura databasen till att köra den ytterligare SQL-koden. Genom att köra sin egen SQL-kod kan hackare uppgradera sin kontoåtkomst, se någon annans privata information eller göra andra ändringar i databasen.

SQL-injektionsprov

Förutsatt att samtalet till din inloggningshanterare för din webbapplikation ser ut så här:

https://somepage.com/ajax/login.ashx?username=admin&password=123

Nu i login.ashx, läser du dessa värden:

strUserName = getHttpsRequestParameterString("username");
strPassword = getHttpsRequestParameterString("password");

och fråga din databas för att avgöra om en användare med det lösenordet finns.

Så du konstruerar en SQL-frågesträng:

txtSQL = "SELECT * FROM Users WHERE username = '" + strUserName + "' AND password = '"+ strPassword +"'";

Det här fungerar om användarnamnet och lösenordet inte innehåller en offert.

Men om en av parametrarna innehåller en offert, kommer SQL som skickas till databasen att se ut så här:

-- strUserName = "d'Alambert";
txtSQL = "SELECT * FROM Users WHERE username = 'd'Alambert' AND password = '123'";

Detta kommer att resultera i ett syntaxfel, eftersom citatet efter d i d'Alambert avslutar SQL-strängen.

Du kan korrigera detta genom att undgå offert i användarnamn och lösenord, t.ex.

strUserName = strUserName.Replace("'", "''");
strPassword = strPassword.Replace("'", "''");

Det är dock mer lämpligt att använda parametrar:

cmd.CommandText = "SELECT * FROM Users WHERE username = @username AND password = @password";

cmd.Parameters.Add("@username", strUserName);
cmd.Parameters.Add("@password", strPassword);

Om du inte använder parametrar och glömmer att ersätta offert i till och med ett av värdena, kan en skadlig användare (aka hacker) använda detta för att köra SQL-kommandon i din databas.

Till exempel, om en angripare är ond, ställer han / hon lösenordet till

lol'; DROP DATABASE master; -- 

och sedan kommer SQL att se ut så här:

"SELECT * FROM Users WHERE username = 'somebody' AND password = 'lol'; DROP DATABASE master; --'";

Tyvärr för dig är detta giltigt SQL, och DB kommer att köra detta!

Denna typ av exploatering kallas en SQL-injektion.

Det finns många andra saker som en skadlig användare kan göra, till exempel att stjäla varje användares e-postadress, stjäla allas lösenord, stjäla kreditkortsnummer, stjäla någon mängd data i din databas etc.

Det är därför du alltid behöver fly undan dina strängar.
Och det faktum att du alltid glömmer att göra det förr eller senare är exakt varför du bör använda parametrar. För om du använder parametrar kommer din programmeringsspråkram att göra det som behövs för dig.

enkelt injektionsprov

Om SQL-satset är konstruerat så här:

SQL = "SELECT * FROM Users WHERE username = '" + user + "' AND password ='" + pw + "'";
db.execute(SQL);

Då kan en hacker hämta dina data genom att ge ett lösenord som pw' or '1'='1 ; det resulterande SQL-uttalandet kommer att vara:

SELECT * FROM Users WHERE username = 'somebody' AND password ='pw' or '1'='1'

Den här passerar lösenordskontrollen för alla rader i tabellen Users eftersom '1'='1' alltid är sant.

Använd SQL-parametrar för att förhindra detta:

SQL = "SELECT * FROM Users WHERE username = ? AND password = ?";
db.execute(SQL, [user, pw]);


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow