php probleme mit einem regulären Ausdruck

lordg2009

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.549
Hi

Ich habe eine Seite, wo einiges an Text in eine Datenbank gespeichert wird. Ich weiß nicht, wie es dazugekommen ist, aber es ist dazu gekommen, dass Zeichen wie ", aber nicht Umlaute doppelt escaped wurden.

Ein " steht jetzt in der Datenbank als '"'
Das & wurde also nochmals escaped.

Der Browser recodiert dann das erste & und stellt dann ein '"' dar.

Da dachte ich mir, ein regulärer Ausdruck, der & vor einem zweiten escapten Zeichen schon serverseitig recodiert könnte klappen, klappt aber nicht.

Hier mein Ausdruck:
PHP:
$str = preg_replace('/&(.*?;)/', '&\1', $str);

Was mache ich da falsch?
Ergänzung ()

Habe jetzt den Fehler gefunden:

Habe mir selbst eine Funktion erstellt, die den POST und GET array testet:

PHP:
// form validation
	function test_input($data)
		{
			$data = trim($data);
			$data = stripslashes($data);
			$data = htmlspecialchars($data);
			return $data;
		}
	// form validation in $_POST schreiben
	function test_post()
		{
			foreach($_POST as $key=>$value)
			{
				$_POST[$key] = test_input("$value");
			}
		}
	// form validation in $_POST schreiben
	function test_get()
		{
			$TGET = array();
			foreach($_GET as $key=>$value)
			{
				$key = test_input("$key");
				$value = test_input("$value");
				$TGET[$key] = $value;
			}
			$_GET = $TGET;
		}

Die Funktionen sollen den escapten Inhalt wieder in den GET bzw. POST array schreiben. Leider habe ich diese Funktionen versehentlich zweimal angewendet, wodurch das & ein zweites Mal escaped wurde.
 
Falscher Ansatz: Die Daten gehören escaped, wenn sie ausgegeben werden. In der DB sind sie immer ohne Formatierung/Codierung vorhanden.
 
das heißt also, von den 3 Testfunktionen nehme ich
htmlspecialchars raus, oder wie?
 
Theoretisch sind alle drei Angaben überflüssig, wenn du die PDO als Verbindungsstück zur DB nutzt. Falls du noch die ganzen mysql_ Funktionen nutzt, sollte aber ein mysql_real_escape_string schon ausreichen. Mit deinen obigen Funktionen verfälschst du den String an sich und nicht die zur DB passenden (, gefährlichen) Sequenzen für Injections.
 
ich benutze noch die mysql funktionen, füge parameter aber immer im statement per $stmt->bind_param(); hinzu.
 
Zurück
Oben