SQL Inject verhindern

01/14/2014 14:19 Dr.Dr.SheldonLeeCooper#1
Hallo,

in den letzten 2 Tagen wurde meine Datenbank in MSSQL 2x gelöscht durch eine Injection von SQLi. Habe mir viele TuT durchgelesen auf Google und verstehe da nur Bahnhof... Wollte fragen ob mir evtl. einer helfen könnte mich davor zu schützen. Da ich mich nicht wirklich sonderlich gut mit MSSQL auskenne suche ich hier Hilfe.

Gebe auch mein restliches e*G, ist zwar nich viel kann aber leider grade nicht mehr bieten...
01/14/2014 14:56 マルコ#2
Mein Tipp: Schau dir mal [Only registered and activated users can see links. Click Here To Register...] an.
Damit kannst du böse Sachen ausfiltern lassen, wenn du den richtigen Filter wählst.
Oder du schaust dir [Only registered and activated users can see links. Click Here To Register...] an.
Mit den Seiten, die ich hier gepostet habe, sollte es kein Problem sein, das auf deinen Script anzuwenden.
01/14/2014 21:08 Sedrika#3
Alle Strings als Hex Wert übergeben.

Wenn der User ";shutdown;--" eingibt, wird der SQL Server herrunter gefahren.
Sollte jetzt dieser aber als Hex Wert, sprich "0x3b73687574646f776e3b2d2d" übergeben werden, wird dieser von SQL als String angenommen und nicht mehr als Befehl.

Beispiel:
Code:
USE [MY_DATABASE]
UPDATE [MY_TABLE] SET [COLUMN] = 0x3b73687574646f776e3b2d2d WHERE [ID] = 0
Nun würde in der Spalte ";shutdown;--" auch als Text stehen.

Falls du für das ganze eine Klasse haben willst siehe hier: [Only registered and activated users can see links. Click Here To Register...]
01/14/2014 22:56 マルコ#4
Quote:
Originally Posted by Sedrika View Post
Alle Strings als Hex Wert übergeben.
Joa, und nun willst du irgendwas in der DB ändern (passiert bei eigenen Entwicklungen doch recht häufig) und musst dich mit HEX rumschlagen?
01/14/2014 23:12 Sedrika#5
Wieso soll man sich mit Hex rumschlagen?
Das ist einfacher als du denkst.
Über PHP einfach mit
Code:
"0x".bin2hex( $string )
und über SQL bsp. in Prozeduren via
Code:
-- Max Username length 16 chars
DECLARE @hex_user VARBINARY(32) = CAST( @user AS VARBINARY(32) )
Ich weiß nicht wo du da ein problem siehst. Wenn ich dadurch jeglichen injection kram aushebeln kann, ist es vollig akzeptabel.

In den Link oben den ich mit dazu gepackt habe ist eine SQL Klasse von mir welche schön alles via PHP absichert, dabei einfach mal auf die Escape funktion schauen. Eine einzige Zeile verhindert jeglische injections.
01/16/2014 08:07 MrSm!th#6
Quote:
Originally Posted by Sedrika View Post
Alle Strings als Hex Wert übergeben.

Wenn der User ";shutdown;--" eingibt, wird der SQL Server herrunter gefahren.
Sollte jetzt dieser aber als Hex Wert, sprich "0x3b73687574646f776e3b2d2d" übergeben werden, wird dieser von SQL als String angenommen und nicht mehr als Befehl.

Beispiel:
Code:
USE [MY_DATABASE]
UPDATE [MY_TABLE] SET [COLUMN] = 0x3b73687574646f776e3b2d2d WHERE [ID] = 0
Nun würde in der Spalte ";shutdown;--" auch als Text stehen.

Falls du für das ganze eine Klasse haben willst siehe hier: [Only registered and activated users can see links. Click Here To Register...]
Unsinn. One4All Lösungen (bis auf Prepared Statements) gibt es nicht.
Alles kurz und klein escapen ist selten sinnvoll. Stattdessen sollte man den Input kontextgerecht validieren.

Und ich persönlich kann hex nicht im Kopf zu ascii umrechnen, weshalb mir ein spontaner Blick in die db durch so eine "Lösung" deutlich erschwert würde.

Und vergessen wir mal nicht die unnötige ~Verdopplung des Speicherbedarfs.
Quote:
Originally Posted by Sedrika View Post
Ich weiß nicht wo du da ein problem siehst. Wenn ich dadurch jeglichen injection kram aushebeln kann, ist es vollig akzeptabel.

In den Link oben den ich mit dazu gepackt habe ist eine SQL Klasse von mir welche schön alles via PHP absichert, dabei einfach mal auf die Escape funktion schauen. Eine einzige Zeile verhindert jeglische injections.
Ebenfalls Unsinn.
01/16/2014 10:12 Coniesan#7
Also ich kann das hier zur Übergabe Validierung nur empfehlen:
[Only registered and activated users can see links. Click Here To Register...]

oder man schreibt sich ne Function:
PHP Code:
    public function checkForbidden($wert) {
        
$checkit preg_match("/^[^!\"\/?*':<>[:space:]]+$/",$wert);
        if(
$checkit) return true;
        else return 
false;
    }