11.05.09, 00:20
|
#1 (permalink)
|
|
Mitglied Brilliant
Registriert seit: Mar 2008
Beiträge: 765
Renommee-Modifikator: 0
|
SQL-Injektion und Problem mit Anführungsstrichen
Guten Abend alle zusammen!
Ich habe bisher das Problem gehabt, dass einfache Anführungsstriche zu Fehlern führen, wenn man diese in einem Text mit in die Datenbank überträgt.
Nun ist mir aufgefallen, dass auf meinem Server:
|
Code:
|
magic_quotes_gpc =Off
|
ausgeschalten ist. Nun habe ich es eingeschalten und es gibt auch keine Fehler mehr mit den einfachen Anführungsstrichen.
Meine Frage ist nun, sind Probleme bekannt, wo er Zeichen einfach ersetzt? Und wie sicher ist es gegen SQL-Injektionen? Ich möchte keine 100%ige Sicherheit, denn die wird man wohl nie erreichen, aber es sollte auf jeden Fall eine kleine Barriere darstellen!
Vielen Dank für eure Hilfe 
|
11.05.09, 08:44
|
#2 (permalink)
|
|
Mitglied Brokat
Registriert seit: Apr 2007
Beiträge: 375
Renommee-Modifikator: 7
|
AW: SQL-Injektion und Problem mit Anführungsstrichen
Moin,
Ich würde es ausgeschalten lassen und "mysql_real_escape_string($string)" verwenden.
|
11.05.09, 11:23
|
#3 (permalink)
|
|
do ut des
Registriert seit: Nov 2001
Ort: Wuppertal
Beiträge: 4.785
Renommee-Modifikator: 54
|
AW: SQL-Injektion und Problem mit Anführungsstrichen
Mit PHP 5.3 ist magic_quotes_gpc deprecated, also veraltet und wird mit PHP sogar entfernt. Also zukunftsweisend denken und Applikationen mit ausgeschalteten magic_quotes_gpc entwickeln.
|
11.05.09, 15:53
|
#4 (permalink)
|
|
Mitglied Brilliant
Registriert seit: Mar 2008
Beiträge: 765
Renommee-Modifikator: 0
|
AW: SQL-Injektion und Problem mit Anführungsstrichen
An "mysql_real_escape_string($string)" habe ich bereits auch gedacht, aber dazu müsste ich ca. 20.000 Zeilen Quellcode umbauen.
Kann man dies nicht global festlegen, dass er bei jedem DB-Verbindungsaufbau dies automatisch immer maskiert?
|
PHP-Code:
|
|
function connect_db() {
###############################
$DB_host = "";
$DB_user = "";
$DB_password = "";
$DB_name = "";
###############################
$db = @mysql_connect ( $DB_host, $DB_user, $DB_password );
@mysql_select_db ( $DB_name, $db ) or sleep( 1 );
return $db;
}
|
|
11.05.09, 15:57
|
#5 (permalink)
|
|
Mitglied Brokat
Registriert seit: Apr 2007
Beiträge: 375
Renommee-Modifikator: 7
|
AW: SQL-Injektion und Problem mit Anführungsstrichen
Wenn es sich nur um POST oder GET Eingaben handelt welche Du umwandeln möchtest, dann würde ich das mit einer kleinen Funktion machen und diese am Anfang einer globalen Datei welche auf jeder Seite includiert wird, aufrufen.
|
PHP-Code:
|
|
// $_POST array maskieren
function maskpost($_POST)
{
foreach ( $_POST as $var => $val )
{
$_POST[$var] = mysql_real_escape_string($val);
}
return $_POST;
}
|
|
11.05.09, 16:42
|
#6 (permalink)
|
|
Mitglied Diamant
Registriert seit: Dec 2007
Ort: Bremen
Beiträge: 3.422
|
AW: SQL-Injektion und Problem mit Anführungsstrichen
Hi,
Zitat:
Zitat von Maniac_81
Wenn es sich nur um POST oder GET Eingaben handelt welche Du umwandeln möchtest, dann würde ich das mit einer kleinen Funktion machen und diese am Anfang einer globalen Datei welche auf jeder Seite includiert wird, aufrufen.
|
das ist keine gute Idee. Das müsste dann ja an anderen Stellen (Vergleiche, Ausgaben in HTML,...) wieder rückgängig gemacht werden. Daten sollte man genau dann behandeln, wenn man sie in einen bestimmten Kontext überführen will.
Zitat:
Zitat von Sasser
Kann man dies nicht global festlegen, dass er bei jedem DB-Verbindungsaufbau dies automatisch immer maskiert?
|
PHP-Code:
|
|
function connect_db() {
###############################
$DB_host = "";
$DB_user = "";
$DB_password = "";
$DB_name = "";
###############################
$db = @mysql_connect ( $DB_host, $DB_user, $DB_password );
@mysql_select_db ( $DB_name, $db ) or sleep( 1 );
return $db;
}
|
|
 Beim Verbindungsaufbau ist doch noch gar nichts zum Maskieren da...
Es mag jetzt bitter sein, das zu hören, aber wenn Du da 20000 Zeilen Quellcode hast, in denen DB-Abfragen kreuz und quer verstreut sind und weder Prepared Statements verwendet werden, noch Benutzerdaten geprüft oder maskiert werden, dann ist das wirklich schlechter Code und Du solltest Dir die Mühe machen und das Ganze neu organisieren. Wer weiß, ob da nicht noch viel mehr im Argen ist, wenn schon solch elementaren Dinge vernachlässigt wurden.
LG
__________________
Da es nötig zu werden scheint: Ich leiste hier keinen Support über PN. Stellt Rückfragen zu Euren Problemen bitte in Eurem Thread, dann können alle helfen.
|
11.05.09, 16:53
|
#7 (permalink)
|
|
Mitglied Brilliant
Registriert seit: Mar 2008
Beiträge: 765
Renommee-Modifikator: 0
|
AW: SQL-Injektion und Problem mit Anführungsstrichen
Gibt es eventuell Erweiterungen, welche solche Sachen überprüfen, welche an die DB gesendet werden!? Muss es doch geben oder?
|
11.05.09, 17:22
|
#8 (permalink)
|
|
<?= "Hello World" ?>
Registriert seit: Sep 2008
Ort: Münsingen (BW)
Beiträge: 287
|
AW: SQL-Injektion und Problem mit Anführungsstrichen
schau dir einmal mysqli an. Das ganze ist sogar Objektorrientiert (gibts aber auch ohne OOP)
__________________
There are only 10 kind of people, those who understand binary and those who don't
Versuch mich zu schlagen!
Mach mal einer das Licht an, ich hör nix!
|
11.05.09, 17:36
|
#9 (permalink)
|
|
do ut des
Registriert seit: Nov 2001
Ort: Wuppertal
Beiträge: 4.785
Renommee-Modifikator: 54
|
AW: SQL-Injektion und Problem mit Anführungsstrichen
Zitat:
Zitat von Sasser
Gibt es eventuell Erweiterungen, welche solche Sachen überprüfen, welche an die DB gesendet werden!? Muss es doch geben oder?
|
Ja, gibt es wahrscheinlich. Aber die wenigstens in PHP. Sie müssen meist selbst kompiliert werden und als PHP Extension eingebunden werden... Kenne spontan aber keine.
Die einfachste Lösung:
Eine vernünftige IDE nutzen, alle Stellen raussuchen, wo ein Query abgesetzt wird und die Ersetzungen vornehmen.
Ist etwas Arbeit, aber dafür um einiges besser als die Alternativen. (wie kuddeldaddeldu ja auch schon sagte)
|
11.05.09, 17:40
|
#10 (permalink)
|
|
Mitglied Diamant
Registriert seit: Dec 2007
Ort: Bremen
Beiträge: 3.422
|
AW: SQL-Injektion und Problem mit Anführungsstrichen
Hi,
Zitat:
Zitat von Sasser
Gibt es eventuell Erweiterungen, welche solche Sachen überprüfen, welche an die DB gesendet werden!? Muss es doch geben oder?
|
Es gibt einen Ansatz von Stefan Esser, SQL-Injections mit Hilfe eines kleinen Lua-Scriptes über MySQL Proxy zu erkennen. Sieht aber eher nach einem Beispiel aus und Du musst MySQL Proxy auf dem DB-Server installieren. Ich würde mich da nicht drauf verlassen und lieber mal sauberen und wartbaren Code produzieren. Die mysqli-Erweiterung, die CookieBuster Dir empfiehlt, bietet Dir alles, was Du brauchst. Deinen Code darauf umstellen wirst Du aber schon müssen.
LG
__________________
Da es nötig zu werden scheint: Ich leiste hier keinen Support über PN. Stellt Rückfragen zu Euren Problemen bitte in Eurem Thread, dann können alle helfen.
|
13.05.09, 01:01
|
#11 (permalink)
|
|
Mitglied Brilliant
Registriert seit: Mar 2008
Beiträge: 765
Renommee-Modifikator: 0
|
AW: SQL-Injektion und Problem mit Anführungsstrichen
Also baue ich das folgendermaßen ein:
|
PHP-Code:
|
|
$db = connect_db ();
mysql_query ( "UPDATE table SET `test` = " . mysql_real_escape_string($test), $db );
mysql_close ( $db );
|
|
13.05.09, 07:05
|
#12 (permalink)
|
|
Mitglied Diamant
Registriert seit: Dec 2007
Ort: Bremen
Beiträge: 3.422
|
AW: SQL-Injektion und Problem mit Anführungsstrichen
Hi,
nee, haargenau so ergibt das keinen Sinn. Wenn die Spalte `test` numerisch ist, was soll dann da mysql_real_escape_string()? Dann solltest Du diesen Wert auf Gültigkeit überprüfen. Wenn die Spalte vom Typ varchar, text o.ä. ist, dann ist die Abfrage syntaktisch falsch, da Strings in MySQL in Hochkommata stehen müssen.
Und Du machst doch wohl hoffentlich nicht für jede einzelne Abfrage einen Connect?
LG
__________________
Da es nötig zu werden scheint: Ich leiste hier keinen Support über PN. Stellt Rückfragen zu Euren Problemen bitte in Eurem Thread, dann können alle helfen.
|
14.05.09, 20:29
|
#13 (permalink)
|
|
Mitglied Brilliant
Registriert seit: Mar 2008
Beiträge: 765
Renommee-Modifikator: 0
|
AW: SQL-Injektion und Problem mit Anführungsstrichen
Wenn ich den Connect nicht immer wieder wiederhole, führt es bestimmte Sachen gar nicht aus Das Problem hatte ich, als ich einmal 3 Operationen ausgeführt habe, denn da hat er die letzte nicht ausgeführt.
Ich das so schlimm, wenn man immer eine neue Verbindung aufbaut und dann gleich wieder schließt? Also ich habe davon im kompletten Projekt ca. 500...
Wenn ich falsch liege, welche Methode würde es denn noch geben?
Umbauen muss ich alles ja sowieso nochmal...
|
14.05.09, 20:36
|
#14 (permalink)
|
|
Mitglied Wurstwasser
Registriert seit: May 2006
Ort: Ebelsbach (Bayern)
Beiträge: 1.145
|
AW: SQL-Injektion und Problem mit Anführungsstrichen
Benutze einfach PDO und Prepared Statements. Das ist wohl die beste Lösung für dein Problem. Allerdings viel Änderungsaufwand, der sich allerdings lohnen dürfte.
__________________
Grüße
--
"Möge der Saft mit euch sein" - Yoghurt aus Spaceballs
|
14.05.09, 21:09
|
#15 (permalink)
|
|
Mitglied Brilliant
Registriert seit: Mar 2008
Beiträge: 765
Renommee-Modifikator: 0
|
AW: SQL-Injektion und Problem mit Anführungsstrichen
Wie kann man sich eigentlich ausgeben lassen,
wieviele Datenbankverbindungen zur Zeit bestehen?
Gibts da ein Script o.a.?
|
|