String-Escape-Clear Funktion

Hallo zusammen,

bei mir schleichen sich oft in Strings massenweise Backslashes vor Anführungszeichen ein.
Diese muss ich nun irgendwie beseitigen, wofür ich mir schon eine Funkrion geschrieben habe:

wie man schon sieht, wollte ich mit preg_replace und str_replace erreichen, das freistehende Backslashes (also welche, die als solche gemeint sind, und eben nicht eine Ansammlung vor einem Anführungszeichen) erhalten bleiben. Leider funktioniert es so noch nicht, vermutlich liegts an meinen REGEX-Kenntnissen…
Zudem würde ich anstelle von for lieber eine Überprüfung auf diese -Ansammlungen vornehemen (preg_match), und while verwenden.
hat bisher aber auch nicht so geklappt, wie ich will.

Könnte mir vllt jemand helfen?

Vielen Dank schonmal.

Hallo,

du solltest die Ursache bekämpfen und das dürfte magic_quotes_gpc sein!

php.net/get_magic_quotes_gpc

Das erste Beispiel verrät dir, wie du damit umgehen kannst!

Möglicherweise gelingt dir das Ersetzen mit:

stripslashes()

Halo Balmung,

wenn ich nicht Irre hat er stripslashes() bereits in seiner Funktion eingebaut :wink: und möchte die for-Schleife ersetzen, da:

Gruß

wozu soll die For-Schleife dienen?

Stripslashes erfüllt genau diesen Zweck. Wo ist also das Problem?
Ich glaub ich verstehe nicht ganz was jw-lighting erreichen will.

Ich glaube das Problem ist die Funktionsweise von stripslashes, wie ich sie aus dem Manual zitiert habe! Wenn er z.B.

[code]$string = ‘sdfgbdjkh hjk\\\\\\" hdfkxg ksdgkdfhj’;

echo stripslashes($string);[/code]
aufruft, erhält er:

Deswegen müsste er stripslashes mehrmals durchführen.

Gruß

Ich benutze diese selbstgeschriebene Funktion um Strings aus get, post oder cookies in DB-querys richtig zu escapen:

function propper_slashes($str, $mysqli=false){ if($mysqli===false) global $mysqli; if(get_magic_quotes_gpc()==1){ $str = stripslashes($str); } return $mysqli->real_escape_string($str); }

stripslashes mehrfach hintereinander aufzurufen, erscheint mir wenig sinnvoll - du kannst überhaupt nicht sagen, wie die Daten korrekt aussehen, also weisst du auch nicht, wie oft Backslashes zu entfernen wären.

magic_quotes_gpc generell zu deaktivieren, ist auf dem eigenen Space das vernünftigste.
Wenn man den Space nicht hinreichend konfigurieren kann, bzw. das Script für die “Eventualität” wappnen will - dann jedes Mal, wenn Daten neu herinkommen, ein Mal nach Prüfung darauf, ob die Option aktiviert ist, die “falschen” Backslashes entfernen - und nicht warten, bis sich über mehrere Zyklen eine nicht mehr beurteilbare Anzahl davon angesammelt hat.

OK, ich beschreibe noch mal, was ich jetzt erreichen möchte:

  • Die for-schliefe gefällt mir als soclhe auch nicht. Mir wäre ein Code wie dieser lieber, stellt sich nur die Frage nach dem ensprechenden Regex:
  • Ein Backslash, der nicht vor einem Ausrüfezeichen steht, also als solches gemeint ist, soll bleiben. Dazu wollte ich mit preg_replace einen solchen Backslash erkennen, und durch die Zeichenfolge “[ASCIIBACK]” kenntlichen machen, die Zeichenfolge wird später mit str_replace() wieder zu einem Backslash verwandelt.

Ungefähr klar, was ich meine?

Welche Nachteile habe ich (was muss ich beachten!), wenn ich magic_quotes_gpc ausschalte?

Du hast dir nicht alles durchgelesen, oder?

Eigentlich nichts - wenn du vernünftig geschriebene Scripte einsetzt.

magic_quotes_gpc war eine blöde Idee, um allzu unbedarfte Scripter vor sich selber zu schützen - die beispielsweise die notwendige Behandlung von Daten vor dem Einfügen in eine SQL-Query vergessen.
Dass diese Option mehr schadet, als sie nutzt, haben die PHP-ler inzwischen auch erkannt - deshalb ist sie per Default schon seit längeren auf off gestellt, und wird auch mit PHP 6 komplett entfallen.

aso, ist also nur für all die, die für mysql_real_escape_string usw. zu doof sind…
Dann kommt das jetzt auf jeden fall auf off. Danke.

Doch, eigentlich schon, wo meinst du denn hab ich was übersehen?

wenn ein user in einem Formular, in einem Textfeld z.b. folgendenen gemischten Text eingibt:

und magic_quotes sind aktiviert, dann fügt php die extra backslashes dorthin wo sie nötig sind. Auch vor den normalen Backslashes. Daraus wird also sowas:

stripslashes macht jetzt genau das was erwartet wird. die Doppelten Backslashes werden zu einfachen. Die Verwendung von Stripslashes würde den Text aus der GET/POST variable also wieder in den originalen Ursprung zurückversetzen:

Es gibt also gar keinen Grund irgendwelche komplexen regex zu verwenden.

Und wie bereits gesagt, sollte man vor der Verwendung von Stripslashes einfachmal abfragen, ob magic_quotes aktiviert sind, wenn nicht, ist stripslashes ja nicht nötig.

Hallo jw-lighting,

in meinem ersten Post habe ich dir einen Link zur Funktion get_magic_quotest_gpc gepostet, dort wird eigentlich alles beantwortet, was jetzt in etlichen Posts noch einmal nachgeholt wurde! Alles weitere hätte wohl Google besorgt!

Hallo Balmung,

du hast schon Recht was das angeht. Jedoch habe ich ihn so verstanden, dass es sich nicht nur um 2 oder 3 \ handelt, sondern dass es auch einige mehr sein können! Das habe ich aber auch schon in einem Post geschrieben und dabei auf die Funktionsweise von stripslashes() hingewiesen und ich mag mich nicht noch einmal wiederholen!

Ja, steht auch alles im Manual!

[quote=“asipak4you”]du solltest die Ursache bekämpfen und das dürfte magic_quotes_gpc sein!

php.net/get_magic_quotes_gpc

Das erste Beispiel verrät dir, wie du damit umgehen kannst![/quote]

Zur Erinnerung!

Naja, macht mal so weiter, dann sind wir nächste Woche noch nicht fertig :smiley:

Das geht jetzt soweit klar, poloz hat sich durch ausgeben und wiederabsenden in einem Formular jetzt oft eine ganze Reihe von Backslashes eingeschlichen, mit sowas habe ich nämlich nicht gerechnet, bin da also wieder um was schlauer geworden.

Daher ist es nötig, das ich Stripslashes nun mehrmals ausführe, und ich wäre dankbar, wenn mir jetzt irgendjemand einen Tipp geben kann, wie ich ein REGEX hinkrige, das mir sagt, ob alle Backslashes weg sind!
Woher das kommt und die Funktionsweise von stripslashes ist mir vollkommen klar, ich will da einfach nur diese nervenden Backslashes wegkriegen, ohne eine Schleife 98mal unnötig laufn zu lassen!

Na bitte :wink:

Und einen regulären Ausdruck habe ich dir auch schon gepostet, hat er dir nicht weitergeholfen?

so, ich habe mich jetzt mal wieder an das Projekt drangesetzt, und deinen RegEx eingebaut.
Leider tat sich da garnischt mehr.
Ich bin also weiterhin auf der Suche nach einer besseren Version meiner Funktion.