Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Maskierung von Sonderzeichen [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
brauche Webseite ideal für Vereine und Firmen
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Maskierung von Sonderzeichen


 
Piremilok
10-01-2008, 20:12 
 
Hallo,

mich hat eine zeitlang das Problem mit Magic_Quotes und der Sonderzeichenmaskierung beschäftigt.

Bei Magic_Quotes wird ja nur vor die "gefährlichen" Sonderzeichen ein Backslash (\) gestellt und mittels einer Überprüfung mit get_magic_quotes_gpc und stripslashes wieder entfernt.

Aber dann kam das Problem mit der Sonderzeichenmaskierung!
Wenn ich ein ein Feld Sonderzeichen wie <, >, ", ... eingebe, so wird ja aus z.B. ä ein &auml;.
Nur wenn ich das Ganze dann aus der Datenbank wieder auslas, war dann das Problem da, dass ich entweder &amp;auml; drannstehen hatte oder wenn ich alles vorher demaskiert habe, ich Probleme mit <, > und " bekommen habe, weil der Text danach einfach nicht mehr angezeigt wurde.

Als Lösung habe ich mir dann 2 Funktionen geschrieben:

function htmlin(&$string, $replace = false) {
$text = $string;
if( is_array($text) )
foreach($text as $key => $value)
$text[$key] = htmlin($value, false);
else
$text = htmlentities($text, ENT_QUOTES, 'ISO-8859-15');

if($replace) $string = $text;
else return $text;
}

function htmlout(&$string, $replace = false) {
$text = $string;
$chars = get_html_translation_table(HTML_ENTITIES, ENT_QUOTES);

if( is_array($text) )
foreach($text as $key => $value)
$text[$key] = htmlout($value);
else {
$text = html_entity_decode($text, ENT_QUOTES, 'ISO-8859-15');
foreach($chars as $char) {
if( stristr($text, $char) ) {
$text = htmlout($text);
break;
}
}
}

if($replace) $string = $text;
else return $text;
}

htmlin maskiert z.B. Ähren --> &amp;Auml;hren
htmlout macht selbst aus &amp;amp;amp;Auml;hren wieder Ähren

Das Problem bei der Sache ist, dass ich jetzt feststellen musste, dass dadurch manche Scripte sehr sehr langsam werden und ich wollte euch fragen (ja, jetzt kommt endlich die Frage):


Wie löst ihr das Problem mit der Werteübergabe, Speicherung in der DB, dem Auslesen und wieder ausgeben in Formularfeldern?


Einerseits muss man sich vor SQL-Injections schützen, andererseits soll alles ganz normal angezeigt werden und auf jedem Server laufen!

Für Aufklärung wäre ich euch sehr dankbar.

gruß
Piremilok

 
ghostgambler
11-01-2008, 00:45 
 
magic_quotes off
Beim Einfügen in die DB mysql_real_escape_string()
Bei der Ausgabe htmlspecialchars()
Fertig.

Ich hab deinen Post jetzt nicht mal ganz gelesen, was auch immer du da machst, es ist viel zu kompliziert...

 
Piremilok
11-01-2008, 17:11 
 
Hi,

was meinst du mit magi_quotes off?
Einfach mit set_magic_quotes_runtime(0) ganz oben im Script deaktivieren?
Muss ich dann nicht mehr stripslashes machen? Bzw. ab wann wirkt sich das aus? wie wirkt sich das aus?

Ich habe in meinen Scripten immer beides drinn:
//Magic-Quotes deaktivieren
@set_magic_quotes_runtime(0);
@ini_set('magic_quotes_sybase', '0');

Wenn du etwas in die MySQL-DB einspeicherst einfach mysql_real_escape. Das mache ich ja auch.

Und wenn du es aus der DB wieder ausliest machst du kein stripslashes()? Nur htmlspecialchars()?


Ich weiß, dass ich es zu kompliziert mache ;)
Deswegen frage ich ja auch...


gruß
Piremilok

 
PHP-Desaster
11-01-2008, 17:26 
 
Muss ich dann nicht mehr stripslashes machen?Doch, musst du. Guck mal hier (http://de.php.net/magic_quotes#76387)
Und wenn du es aus der DB wieder ausliest machst du kein stripslashes()? Nur htmlspecialchars()?Wie er schon sagt, ja, nur htmlspecialchars

 
Piremilok
12-01-2008, 12:27 
 
Hallo,

habe das jetzt nochmal ausführlich getestet und ich weiß nicht, wie ich auf so einen Schmarrn gekommen bin!

Vielen herzlichen Dank für eure Hilfe.

-------------------------------------

Noch eine Verständnisfrage zu Magic_Quotes:
Ab wann greift es?

1. Ich deaktiviere magic_quotes ganz oben im Script mit
@set_magic_quotes_runtime(0);

2. Ich schicke über dieses Script ein Formular an selbiges ab (z.B. für Zwischenspeichern)

Sind die per GET oder POST übergebenen Daten nun maskiert oder nicht? Oder wie darf ich das verstehen?
Wann greift magic_quotes?

Ich glaub da steh ich grad momentan auf'm Schlauch und irgendwie hilft da auch kein Schritt zur Seite... :dontknow:


Derzeit sieht der Aufbau meiner globals.php noch so aus:
<?php
...

//Funktion um Slashes in Arrays zu entfernen
function stripslashes_array(&$array) {
foreach($array as $key => $val) {
if (is_string($val)) $array[$key] = stripslashes($val);
elseif (is_array($val)) $array[$key] = stripslashes_array($val);
}
return $array;
}

//Slashs aus den übergebbaren Variablen entfernen, sofern Magic-Quotes aktiv
if (get_magic_quotes_gpc()) {
if (count($_REQUEST)) stripslashes_array($_REQUEST);
if (count($_POST)) stripslashes_array($_POST);
if (count($_GET)) stripslashes_array($_GET);
if (count($_COOKIE)) stripslashes_array($_COOKIE);
if (count($_SERVER)) stripslashes_array($_SERVER);
}

//Magic-Quotes deaktivieren
@set_magic_quotes_runtime(0);
@ini_set('magic_quotes_sybase', '0');

...
?>


Vielen Dank für Antworten...


gruß
Piremilok

 
ghostgambler
12-01-2008, 13:39 
 
magic_quotes != magic_quotes_runtime
Siehe Manual!

Und magic_quotes lässt sich *nur* über die php.ini setzen (oder über eine htaccess-Direktive, auf jeden Fall aber VOR dem Skript - steht auch afaik im Manual)


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:15 Uhr.