SQL handleiding

SQL TUIS SQL Inleiding SQL-sintaksis SQL Kies SQL Kies Distinct SQL Waar SQL En, of, nie SQL Bestel deur SQL Voeg in SQL nulwaardes SQL-opdatering SQL verwyder SQL Kies Top SQL Min en Max SQL-telling, gemiddeld, som SQL Soos SQL Wildcards SQL in SQL Tussen SQL aliasse SQL sluit aan SQL Inner Sluit aan SQL Links Sluit aan SQL Reg Sluit aan SQL Volledige Aansluiting SQL Self Sluit aan SQL Unie SQL Groep deur SQL het SQL bestaan SQL Enige, Almal SQL Kies In SQL Voeg in Kies SQL-geval SQL nul-funksies SQL gestoorde prosedures SQL opmerkings SQL-operateurs

SQL- databasis

SQL Skep DB SQL Drop DB SQL Backup DB SQL Skep tabel SQL Drop Tabel SQL Verander Tabel SQL-beperkings SQL nie nul nie SQL Uniek SQL Primêre Sleutel SQL buitelandse sleutel SQL Check SQL verstek SQL-indeks SQL Outo-verhoging SQL datums SQL-aansigte SQL-inspuiting SQL Hosting SQL-datatipes

SQL- verwysings

SQL sleutelwoorde MySQL-funksies SQL Server funksies MS Access funksies SQL Vinnige Verw

SQL voorbeelde

SQL voorbeelde SQL vasvra SQL-oefeninge SQL-sertifikaat

SQL -inspuiting


SQL-inspuiting

SQL-inspuiting is 'n kode-inspuitingstegniek wat u databasis kan vernietig.

SQL-inspuiting is een van die mees algemene webkrakertegnieke.

SQL-inspuiting is die plasing van kwaadwillige kode in SQL-stellings, via webbladinvoer.


SQL in webblaaie

SQL-inspuiting vind gewoonlik plaas wanneer jy 'n gebruiker vir invoer vra, soos hul gebruikersnaam/gebruiker-ID, en in plaas van 'n naam/id, gee die gebruiker vir jou 'n SQL-stelling wat jy onwetend op jou databasis sal laat loop.

Kyk na die volgende voorbeeld wat 'n SELECTstelling skep deur 'n veranderlike (txtUserId) by 'n uitgesoekte string te voeg. Die veranderlike word van gebruikersinvoer (getRequestString) gehaal:

Voorbeeld

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

Die res van hierdie hoofstuk beskryf die potensiële gevare van die gebruik van gebruikersinvoer in SQL-stellings.


SQL-inspuiting gebaseer op 1=1 is altyd waar

Kyk weer na die voorbeeld hierbo. Die oorspronklike doel van die kode was om 'n SQL-stelling te skep om 'n gebruiker te kies, met 'n gegewe gebruiker-ID.

As daar niks is wat 'n gebruiker verhoed om "verkeerde" invoer in te voer nie, kan die gebruiker een of ander "slim" invoer soos volg invoer:

Gebruiker-ID:

Dan sal die SQL-stelling soos volg lyk:

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

Die SQL hierbo is geldig en sal ALLE rye van die "Gebruikers"-tabel terugstuur, aangesien OF 1=1 altyd WAAR is.

Lyk die voorbeeld hierbo gevaarlik? Wat as die "Gebruikers"-tabel name en wagwoorde bevat?

Die SQL-stelling hierbo is baie dieselfde as hierdie:

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

'n Hacker kan toegang kry tot al die gebruikersname en wagwoorde in 'n databasis deur eenvoudig 105 OF 1=1 in die invoerveld in te voeg.



SQL-inspuiting gebaseer op ""="" is altyd waar

Hier is 'n voorbeeld van 'n gebruikersaanmelding op 'n webwerf:

Gebruikersnaam:

Wagwoord:

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"

'n Hacker kan dalk toegang tot gebruikername en wagwoorde in 'n databasis kry deur eenvoudig " OF ""=" in die gebruikersnaam of wagwoord tekskassie in te voeg:

Gebruikersnaam:

Wagwoord:

Die kode by die bediener sal 'n geldige SQL-stelling soos hierdie skep:

Resultaat

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

Die SQL hierbo is geldig en sal alle rye van die "Gebruikers"-tabel terugstuur, aangesien OF ""="" altyd WAAR is.


SQL-inspuiting gebaseer op batched SQL-stellings 

Die meeste databasisse ondersteun batched SQL-stelling.

'n Bondel SQL-stellings is 'n groep van twee of meer SQL-stellings, geskei deur kommapunte.

Die SQL-stelling hieronder sal alle rye van die "Gebruikers"-tabel terugstuur, en dan die "Verskaffers"-tabel uitvee.

Voorbeeld

SELECT * FROM Users; DROP TABLE Suppliers

Kyk na die volgende voorbeeld:

Voorbeeld

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

En die volgende insette:

Gebruiker ID:

Die geldige SQL-stelling sal soos volg lyk:

Resultaat

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

Gebruik SQL-parameters vir beskerming

Om 'n webwerf teen SQL-inspuiting te beskerm, kan jy SQL-parameters gebruik.

SQL-parameters is waardes wat op 'n beheerde wyse by 'n SQL-navraag gevoeg word tydens uitvoering.

ASP.NET Razor Voorbeeld

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

Let daarop dat parameters in die SQL-stelling deur 'n @-merker voorgestel word.

Die SQL-enjin kontroleer elke parameter om te verseker dat dit korrek is vir sy kolom en letterlik behandel word, en nie as deel van die SQL wat uitgevoer moet word nie.

Nog 'n 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);

Voorbeelde

Die volgende voorbeelde wys hoe om geparameteriseerde navrae in sommige algemene webtale te bou.

KIES 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();

VOEG IN VERKLARING IN ASP.NET IN:

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();

VOEG IN VERKLARING IN PHP IN:

$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();