"böse" SQL-Wörter

Das Forum für Programmierer und Systemadmins. Von Shell-, Perl- und PHP-Scripts bis zur objektorientierten Programmierung mit C++.

Beitragvon hellbringer » Mo 03 Mär, 2008 09:39

Beim Auslesen ist erst recht wuascht.
hellbringer
Profi-User
Profi-User
 
Beiträge: 1619
Registriert: Di 04 Mai, 2004 19:35

Beitragvon Elij4h » Mo 03 Mär, 2008 10:54

das is ein irrtum.
stell dir vor sowas kommt als userinput daher:

Code: Alles auswählen
'; DELETE Orders;--


dann ein insert: (egal ob mit prepared statement oder nicht)
Code: Alles auswählen
INSERT Favourites (UserID, FriendlyName, Criteria)
VALUES(123, 'My Attack', ''';DELETE Orders;--')



auslesen aus der db:
Code: Alles auswählen
int uid = this.GetUserID();
string friendlyName = this.GetFriendlyName();

string sql = string.Format("SELECT Criteria FROM Favourites "+
    "WHERE UserID={0} AND FriendlyName='{1}'",
    uid, friendlyName);
SqlCommand cmd = new SqlCommand(sql, this.Connection);
string criteria = cmd.ExecuteScalar();

sql = string.Format("SELECT * FROM Products WHERE ProductName = '{0}'",
    criteria);
SqlDataAdapter da = new SqlDataAdapter(sql, this.Connection);
da.Fill(this.productDataSet);


so schaut dann das sql statement aus was da raus kommt ohne prepared statement bei der abfrage:

Code: Alles auswählen
SELECT * FROM Products WHERE ProductName = ''; DELETE Orders;--


... und weg sind alle orders.

quelle: http://www.codeproject.com/KB/database/ ... tacks.aspx
Elij4h
Neu im Board
Neu im Board
 
Beiträge: 16
Registriert: Fr 01 Feb, 2008 11:55
Wohnort: Eferding

Beitragvon hellbringer » Mo 03 Mär, 2008 13:21

So macht mans auch nicht.

Eher so:

SELECT * FROM `Products` WHERE `ProductName` IN (SELECT `Criteria` FROM `Favourites` WHERE .....)

Und wenn man Strings vorher immer schön brav escaped, kann sowieso nix passieren.
hellbringer
Profi-User
Profi-User
 
Beiträge: 1619
Registriert: Di 04 Mai, 2004 19:35

Beitragvon mbru » Mo 03 Mär, 2008 17:17

also wenn man prepared statements falsch verwendet ist einem auch nicht mehr zu helfen und man sollte die finger davon lassen ;)

prinzipiell würde ich sagen sind nur prepared statements ein sinnvoller schutz gegen sql injection.
mbru
Board-Mitglied
Board-Mitglied
 
Beiträge: 220
Registriert: Do 06 Sep, 2007 09:23

Beitragvon Elij4h » Mo 03 Mär, 2008 18:45

hellbringer hat geschrieben:So macht mans auch nicht.

Eher so:

SELECT * FROM `Products` WHERE `ProductName` IN (SELECT `Criteria` FROM `Favourites` WHERE .....)

klar kannst das ganze in ein sql statement packen und das problem tirtt hier dann nicht auf :D sollte ja nur ein beispiel sein was passieren kann wenn man nicht aufpasst. sicherer is man IMHO jedenfalls mit stored procedures unterwegs.

hellbringer hat geschrieben:Und wenn man Strings vorher immer schön brav escaped, kann sowieso nix passieren.

jop, sicher is sicher. wobei passieren kann immer was. z.B.: jeden string blind zu escapen ist sicher der falsche ansatz.

@mbru:
und jo bin auch der meinung das nur prepared statments / stored procedures sql injection zuverlässig verhindern.

@max_payne
wenn aber, wie in deinem fall keine prepared statements verwendet werden können, muss man halt den userinput solange parsen und überprüfen(einschränken) bis der user keine fehleingaben mehr machen kann die in die abfrage kommen. (vor allem escape und sonderzeichen) -> mit regexpr prüfen etc.

lg, eli
Elij4h
Neu im Board
Neu im Board
 
Beiträge: 16
Registriert: Fr 01 Feb, 2008 11:55
Wohnort: Eferding

Vorherige

Zurück zu PROGRAMMIER FORUM

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 2 Gäste