SQL-Injektion und Problem mit Anführungsstrichen

Sasser

Erfahrenes Mitglied
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 :)
 
Moin,

Ich würde es ausgeschalten lassen und "mysql_real_escape_string($string)" verwenden.
 
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.
 
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:
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;
}
 
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:
// $_POST array maskieren 
	function maskpost($_POST)
	{
		foreach ( $_POST as $var => $val ) 
		  { 
			$_POST[$var] = mysql_real_escape_string($val); 
		  } 

		 return $_POST;
	}
 
Hi,

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.

Kann man dies nicht global festlegen, dass er bei jedem DB-Verbindungsaufbau dies automatisch immer maskiert?

PHP:
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;
}

:confused: 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
 
Gibt es eventuell Erweiterungen, welche solche Sachen überprüfen, welche an die DB gesendet werden!? Muss es doch geben oder?
 
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)
 
Hi,

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
 

Neue Beiträge

Zurück