"böse" SQL-Wörter

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

"böse" SQL-Wörter

Beitragvon max_payne » Sa 01 Mär, 2008 12:55

Hallo!
Ich würde gerne die benutzereingabe in einem c# programm auf "böse" sql-befehle überprüfen.
bisher wären mir Folgende Sachen eingefallen:
"select"
"insert"
"update"
"delete"
"union"
"drop"
"alter"
"go"
"exec"
"cmdshell"

fällt noch wem was ein?
max_payne
Ultimate Power-User
Ultimate Power-User
 
Beiträge: 4982
Registriert: Mo 30 Aug, 2004 12:25

Beitragvon hellbringer » Sa 01 Mär, 2008 13:00

Wozu?
hellbringer
Profi-User
Profi-User
 
Beiträge: 1619
Registriert: Di 04 Mai, 2004 19:35

Beitragvon max_payne » Sa 01 Mär, 2008 13:10

was heißt wozu?
max_payne
Ultimate Power-User
Ultimate Power-User
 
Beiträge: 4982
Registriert: Mo 30 Aug, 2004 12:25

Beitragvon hellbringer » Sa 01 Mär, 2008 13:13

Naja, zu welchem Zweck? Einfach so?
hellbringer
Profi-User
Profi-User
 
Beiträge: 1619
Registriert: Di 04 Mai, 2004 19:35

Beitragvon max_payne » Sa 01 Mär, 2008 13:18

Naja, zu welchem Zweck? Einfach so?

im prinzip will ich sql injections abfangen
max_payne
Ultimate Power-User
Ultimate Power-User
 
Beiträge: 4982
Registriert: Mo 30 Aug, 2004 12:25

Beitragvon hellbringer » Sa 01 Mär, 2008 13:24

Dann würd ich einfach Escapen.
Zuletzt geändert von hellbringer am Sa 01 Mär, 2008 13:25, insgesamt 1-mal geändert.
hellbringer
Profi-User
Profi-User
 
Beiträge: 1619
Registriert: Di 04 Mai, 2004 19:35

Beitragvon max_payne » Sa 01 Mär, 2008 13:24

gibts da ne gscheite funktion in c#?
max_payne
Ultimate Power-User
Ultimate Power-User
 
Beiträge: 4982
Registriert: Mo 30 Aug, 2004 12:25

Beitragvon hellbringer » Sa 01 Mär, 2008 13:42

Ich vermute mal, das macht das Ding schon selber von Haus aus. Zumindest würde ich die Dokumentation so deuten. Hab leider überhaupt keine Ahnung von c#, aber du kannst es ja mal ausprobieren (gib paar Hochkommas, Sonderzeichen, etc. in den String).

http://dev.mysql.com/doc/refman/5.0/en/connector-net-using-prepared.html
http://dev.mysql.com/doc/refman/5.0/en/connector-net-examples-mysqlcommand.html#connector-net-examples-mysqlcommand-parameters
hellbringer
Profi-User
Profi-User
 
Beiträge: 1619
Registriert: Di 04 Mai, 2004 19:35

Beitragvon max_payne » Sa 01 Mär, 2008 13:49

nein, aus "technischen" gründen kann ich keine paramter verwenden
max_payne
Ultimate Power-User
Ultimate Power-User
 
Beiträge: 4982
Registriert: Mo 30 Aug, 2004 12:25

Beitragvon Elij4h » So 02 Mär, 2008 16:36

damit du sql injects effizient verhinder kannst musst du erst mal sicher stellen das der userinput nicht mit nem escape(') beginnt. sql inserts beginnen typischerweise mit ' und enden mit -- (comment -> der rest wird so ignoriert)
z.B.:
Code: Alles auswählen
'; DELETE Bla;--


für strings mal:

ein schritt kann mal sein ' zu ersetzten. z.B. so:
Code: Alles auswählen
string cleaninput = input.Replace("'", "''");

oder aber auch mit regex prüfen dass nur buchstaben im input sein dürfen.

wenn du eine nummer eingeben lässt:

Code: Alles auswählen
Regex re = new Regex(@"\D");
Match m = re.Match(someTextBox.Text);
if (m.Success)
{
    // keine nummer

}
else
{
    int intValue = int.Parse(stringValue);

    if ((intValue < minValue) || (intValue > maxValue))
    {
        // nicht im erlaubten bereich

    }
}


und dann noch Parametrisierte SQL commands(wenn das in deiner app geht.).
z.B.:
Code: Alles auswählen
string cmdText = "SELECT * FROM irgendwas "+
    "WHERE Name=@Name";
SqlCommand cmd = new SqlCommand(cmdText, connection);
cmd.Parameters.Add("@Name", SqlDbType.VarChar, 80).Value = "blubb";


*hth*, lg Eli

//edit:
ahjo welches DBMS verwendest eigentlich? sql express oder was anderes?
Elij4h
Neu im Board
Neu im Board
 
Beiträge: 16
Registriert: Fr 01 Feb, 2008 11:55
Wohnort: Eferding

Beitragvon mbru » So 02 Mär, 2008 20:32

wenn du es schon ordentlich machen willst, dann aber richtig mit prepared statements.
mbru
Board-Mitglied
Board-Mitglied
 
Beiträge: 220
Registriert: Do 06 Sep, 2007 09:23

Beitragvon Elij4h » So 02 Mär, 2008 22:13

mbru hat geschrieben:wenn du es schon ordentlich machen willst, dann aber richtig mit prepared statements.

jo... aber prepared statements machen nur typ überprüfung, in nen string kannst desswegen noch genauso injecten.
Elij4h
Neu im Board
Neu im Board
 
Beiträge: 16
Registriert: Fr 01 Feb, 2008 11:55
Wohnort: Eferding

Beitragvon max_payne » So 02 Mär, 2008 22:57

ahjo welches DBMS verwendest eigentlich? sql express oder was anderes?

sqlexpress

parameter gehen in meinem fall nicht
max_payne
Ultimate Power-User
Ultimate Power-User
 
Beiträge: 4982
Registriert: Mo 30 Aug, 2004 12:25

Beitragvon mbru » Mo 03 Mär, 2008 07:08

Elij4h hat geschrieben:
mbru hat geschrieben:wenn du es schon ordentlich machen willst, dann aber richtig mit prepared statements.

jo... aber prepared statements machen nur typ überprüfung, in nen string kannst desswegen noch genauso injecten.


:-? :-?

Prepared statements verhindern SQL injection zu 100%. Nix vom "boesen" SQL code wird auch nur jemals ausgeführt wenn man konsequent prepared statements verwendet.

Klar kann SQL code dan in der Datenbank stehen, nur er tut nicht weh.
Abgesehen davon kann man USer input sowieso nie vertrauen.

Falls ich mich irre bitte ein Gegenbeispiel.
mbru
Board-Mitglied
Board-Mitglied
 
Beiträge: 220
Registriert: Do 06 Sep, 2007 09:23

Beitragvon Elij4h » Mo 03 Mär, 2008 09:15

hmm jetzt wo ich nachdenk hast recht... wennst wieder mit prepared statements die daten aus der datenbank ausliest kann nix passieren :) hab mich aufs einfügen festgebissen :D
Elij4h
Neu im Board
Neu im Board
 
Beiträge: 16
Registriert: Fr 01 Feb, 2008 11:55
Wohnort: Eferding

Nächste

Zurück zu PROGRAMMIER FORUM

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste