SQL -zelfstudie

SQL HOME SQL-intro SQL-syntaxis SQL-selectie SQL Select Distinct SQL waar SQL en, of, niet SQL-bestelling op SQL invoegen in SQL-nulwaarden SQL-update SQL verwijderen SQL Selecteer Top SQL Min en Max Aantal SQL, Gem, Som SQL Vind ik leuk SQL-jokertekens SQL In SQL Tussen SQL-aliassen SQL-joins SQL Inner Join SQL Left Join SQL juiste join Volledige deelname aan SQL Zelf lid worden van SQL SQL-unie SQL Groeperen op SQL hebben SQL bestaat SQL Alle, Alle SQL Selecteren in SQL invoegen in selecteren SQL-geval SQL Null-functies Op SQL opgeslagen procedures SQL-opmerkingen SQL-operators

SQL- database

SQL creëren DB SQL Drop-DB SQL back-up DB SQL-tabel maken SQL-droptabel SQL-wijzigingstabel SQL-beperkingen SQL niet null SQL Uniek Primaire SQL-sleutel SQL externe sleutel SQL-controle SQL-standaard SQL-index Automatische SQL-verhoging SQL-datums SQL-weergaven SQL injectie SQL-hosting SQL-gegevenstypen

SQL- verwijzingen

SQL-trefwoorden MySQL-functies SQL Server-functies MS Access-functies Snelle SQL-referentie

SQL- voorbeelden

SQL-voorbeelden SQL-quiz SQL-oefeningen SQL-certificaat

SQL -injectie


SQL injectie

SQL-injectie is een code-injectietechniek die uw database kan vernietigen.

SQL-injectie is een van de meest voorkomende technieken voor het hacken van websites.

SQL-injectie is het plaatsen van kwaadaardige code in SQL-statements, via webpagina-invoer.


SQL in webpagina's

SQL-injectie vindt meestal plaats wanneer u een gebruiker om invoer vraagt, zoals hun gebruikersnaam/gebruikers-ID, en in plaats van een naam/id geeft de gebruiker u een SQL-instructie die u onbewust op uw database uitvoert.

Bekijk het volgende voorbeeld waarin een SELECTinstructie wordt gemaakt door een variabele (txtUserId) toe te voegen aan een select-tekenreeks. De variabele wordt opgehaald uit gebruikersinvoer (getRequestString):

Voorbeeld

txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;

De rest van dit hoofdstuk beschrijft de mogelijke gevaren van het gebruik van gebruikersinvoer in SQL-instructies.


SQL-injectie op basis van 1=1 is altijd waar

Kijk nog eens naar het voorbeeld hierboven. Het oorspronkelijke doel van de code was om een ​​SQL-statement te maken om een ​​gebruiker te selecteren, met een bepaald gebruikers-ID.

Als er niets is dat een gebruiker verhindert om "verkeerde" invoer in te voeren, kan de gebruiker een "slimme" invoer als volgt invoeren:

Gebruikersnaam:

Het SQL-statement ziet er dan als volgt uit:

SELECT * FROM Users WHERE UserId = 105 OR 1=1;

De bovenstaande SQL is geldig en retourneert ALLE rijen uit de tabel "Gebruikers", aangezien OR 1=1 altijd WAAR is.

Ziet het bovenstaande voorbeeld er gevaarlijk uit? Wat als de tabel "Gebruikers" namen en wachtwoorden bevat?

De bovenstaande SQL-instructie is vrijwel hetzelfde als deze:

SELECT UserId, Name, Password FROM Users WHERE UserId = 105 or 1=1;

Een hacker kan toegang krijgen tot alle gebruikersnamen en wachtwoorden in een database door simpelweg 105 OR 1=1 in het invoerveld in te voeren.



SQL-injectie op basis van ""="" is altijd waar

Hier is een voorbeeld van een gebruikersaanmelding op een website:

Gebruikersnaam:

Wachtwoord:

Voorbeeld

uName = getRequestString("username");
uPass = getRequestString("userpassword");

sql = 'SELECT * FROM Users WHERE Name ="' + uName + '" AND Pass ="' + uPass + '"'

Resultaat

SELECT * FROM Users WHERE Name ="John Doe" AND Pass ="myPass"

Een hacker kan toegang krijgen tot gebruikersnamen en wachtwoorden in een database door simpelweg " OR ""=" in het tekstvak gebruikersnaam of wachtwoord in te voegen:

Gebruikersnaam:

Wachtwoord:

De code op de server maakt een geldige SQL-instructie zoals deze:

Resultaat

SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""=""

De bovenstaande SQL is geldig en retourneert alle rijen uit de tabel "Gebruikers", aangezien OR ""="" altijd WAAR is.


SQL-injectie op basis van batch-SQL-statements 

De meeste databases ondersteunen een batch-SQL-instructie.

Een batch SQL-instructies is een groep van twee of meer SQL-instructies, gescheiden door puntkomma's.

De onderstaande SQL-instructie retourneert alle rijen uit de tabel "Gebruikers" en verwijdert vervolgens de tabel "Leveranciers".

Voorbeeld

SELECT * FROM Users; DROP TABLE Suppliers

Kijk naar het volgende voorbeeld:

Voorbeeld

txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;

En de volgende invoer:

Gebruikersnaam:

De geldige SQL-instructie ziet er als volgt uit:

Resultaat

SELECT * FROM Users WHERE UserId = 105; DROP TABLE Suppliers;

Gebruik SQL-parameters voor bescherming

Om een ​​website te beschermen tegen SQL-injectie, kunt u SQL-parameters gebruiken.

SQL-parameters zijn waarden die tijdens de uitvoering op een gecontroleerde manier aan een SQL-query worden toegevoegd.

ASP.NET Razor Voorbeeld

txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = @0";
db.Execute(txtSQL,txtUserId);

Merk op dat parameters in de SQL-instructie worden weergegeven door een @-markering.

De SQL-engine controleert elke parameter om er zeker van te zijn dat deze correct is voor zijn kolom en letterlijk wordt behandeld, en niet als onderdeel van de uit te voeren SQL.

Een ander voorbeeld

txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)";
db.Execute(txtSQL,txtNam,txtAdd,txtCit);

Voorbeelden

In de volgende voorbeelden ziet u hoe u query's met parameters kunt bouwen in enkele veelvoorkomende webtalen.

SELECTEER VERKLARING IN ASP.NET:

txtUserId = getRequestString("UserId");
sql = "SELECT * FROM Customers WHERE CustomerId = @0";
command = new SqlCommand(sql);
command.Parameters.AddWithValue("@0",txtUserId);
command.ExecuteReader();

INVOER IN VERKLARING IN ASP.NET:

txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)";
command = new SqlCommand(txtSQL);
command.Parameters.AddWithValue("@0",txtNam);
command.Parameters.AddWithValue("@1",txtAdd);
command.Parameters.AddWithValue("@2",txtCit);
command.ExecuteNonQuery();

INVOER IN VERKLARING IN PHP:

$stmt = $dbh->prepare("INSERT INTO Customers (CustomerName,Address,City)
VALUES (:nam, :add, :cit)");
$stmt->bindParam(':nam', $txtNam);
$stmt->bindParam(':add', $txtAdd);
$stmt->bindParam(':cit', $txtCit);
$stmt->execute();