MYSQL Injections -> Richtige Funktion zum verhindern?

SantaCruze

Erfahrenes Mitglied
Hallo miteinander :) Ich habe folgende Funktion in meiner Funktions Datei stehen. Diese Funktion allerdings hat mir ein Kumpel geschrieben, allerdings weiß ich nicht genau ob diese richtig funktioniert und ob sie ihren Sinn erfüllt. Wenn jmd Vorschläge hat wie man diese verändern / verbessern kann wäre ich sehr dankbar. Als kleine Zusatzfrage : Reicht diese Funktion als Funktion in der php datei wo ich alle function aufrufe habe oder muss ich die zusätzlich in alle Scripte einbauen ?

PHP:
function textfilter($text)
{
$text=strtr($text,"\"+-`'","   ");
$p=0;
$tex=" ".strtoupper($text);
$p+=strpos($tex,"DROP");
$p+=strpos($tex,"TRUNCATE");
$p+=strpos($tex," SET ");
$p+=strpos($tex,"WHERE");
$p+=strpos($tex,"UPDATE");
$p+=strpos($tex,"DELETE");
$p+=strpos($tex,"FROM");
$p+=strpos($tex,"INSERT");
if ($p!=0)
{
$text=" http:// - +".strtoupper($text);
$text=str_replace("DROP","<font color=red>Zensiert</font>",$text);
$text=str_replace("TRUNCATE","<font color=red>Zensiert</font>",$text);
$text=str_replace(" SET ","<font color=red>Zensiert</font>",$text);
$text=str_replace("WHERE","<font color=red>Zensiert</font>",$text);
$text=str_replace("UPDATE","<font color=red>Zensiert</font>",$text);
$text=str_replace("DELETE","<font color=red>Zensiert</font>",$text);
$text=str_replace("FROM","<font color=red>Zensiert</font>",$text);
$text=str_replace("INSERT","<font color=red>Zensiert</font>",$text);
}
return $text;
}
 
Hi,

I don't know if you understand me, but if you drop this script on your server and set it up, nobody will be able to ask where somebody else is from or how to insert an update of some data.

Also: Wozu so kompliziert und ineffektiv?
Ich jage jede Benutzereingabe durch diese Funktion (sicherlich etwas ineffektiv):
PHP:
function clearRequest(&$request) {
	if (!isset($request))
		return false;
	if (get_magic_quotes_gpc()) {
		if (is_array($request)) {
			foreach ($request as $key => $value) {
				$request[$key] = clearRequest($value);
			} 
		} else {
			$request = trim(stripslashes($request));
		} 
	} 
	return $request;
}
Bevor ich dann irgendwelche Daten in ein MySQL-Query setze, jage ich diese duch die schon oben angesprochene Funktion mysql_real_escape_string.

Mamphil
 
Jetzt versteh ich glaube ich noch weniger, wenn ich die Function die Du gerade gepostet hast zusätzlich verwende, werden die meisten Injections rausgefiltert ist das richtig? Kann ich meine Funktion dann löschen oder sollte ich die auch weiterhin beibehalten ?
 
Hi,

mit meiner Funktion werden die ggf. automatisch hinzugefügten Backslashes entfernt - wenn sie automatisch hinzugefügt wurden.
Mit mysql_real_escape_string wird der String dann so entschärft, dass er keinen Schaden enthalten kann: Er darf gerne weiterhin INSERT, SELECT etc. enthalten, solche Daten werden aber ausschließlich als Daten gespeichert, es werden keine entsprechenden MySQL-Befehle durchgeführt.

Mamphil
 
Du versuchst Keywords zu Entfernen. Also

dumdidum"; myFunction(DROP TABLE foobar) ; "blabal

wird zu

dumdidum"; myFunction(<font color=red>Zensiert</font> TABLE foobar) ; "blabal

Ist sicher mal besser als garnichts. Aber auch nicht perfekt weil das trotzdem einen Parseerror ausgeben wird.
Die Lösung der anderen sieht vor, das folgendes passiert:

dumdidum\"; myFunction(DROP TABLE foobar) ; \"blabal

Dadurch ist der String escaped und alles nasty Zeugs ist entschärft.
Also am besten mit mysql_real_escaped_string vor dem SQL Query ausführen und nach dem Auslesen der Daten mit Mamphil Funktion wieder in den Orginalzustand versetzen.

MFG
X
 
Hallo Mamphil,

ich glaube ich verstehe den Sinn und Zweck der Funktion clearRequest nicht so ganz.... Automatisch hinzugefügte backslashes werden entfernt? :confused: Wann geschieht denn so etwas?
Und setzt du diese Funktion vor jedes Request?

Ein kurzes Anwendungsbeispiel wäre super :)
 
Das automatisch Maskieren wird bei PHP Magic Quotes genannt. Keine Ahnung, wer sich diese sinnlose Funktion ausgedacht hat. Hoffentlich verschwindet sie bald.
 
Das automatisch Maskieren wird bei PHP Magic Quotes genannt. Keine Ahnung, wer sich diese sinnlose Funktion ausgedacht hat. Hoffentlich verschwindet sie bald.
Meinst du damit meine Funktion?

Wie auch immer:
Wenn die Magic Quotes aktiviert sind, werden alle Anführungszeichen (und noch ein paar mehr), die z. B. aus Formulareingaben kommen, mit einem Backslash maskiert.
Beispiel: Du gibt in ein Formular folgendes ein:
Code:
Die erste Festplatte bei Windows heißt "C:\".
Die entsprechende REQUEST-Variable enthält dann folgendes bei aktivieren Magic Quotes:
Code:
Die erste Festplatte bei Windows heißt \"C:\\\".
Bei deaktivierten Magic Quotes enthält sie die ursprüngliche Eingabe.

Um die zusätzlichen Quotes bei aktivierten Magic Quotes zu entfernen, ist meine clearRequest-Funktion gedacht. Wenn du grundsätzlich ein "stripslashes" verwendest, gibt es Probleme bei deaktiviertem Magic Quotes. Das würde dann so aussehen:
Code:
Die erste Festplatte bei Windows heißt "C:".
Der eine Backslash wäre dann verschwunden...

Mamphil
 
Zurück