Bei textarea POST kommt was komisches raus

Kurt Cobain

Erfahrenes Mitglied
Tach

Also hab den Code hier:
PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>

<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post">


    Message:
    <br />
    <textarea name="message" cols="30" rows="10"><?php echo $_POST["message"]; ?></textarea>
        <br /><br />

    <input type="Submit" name="sub" value="Abschicken">

    <?php echo $_POST["message"]; ?>
</form>


</body>
</html>

Wenn Ich jetzt in die Textarea " eingeb kommt nacher \" raus.
Unde wenn Ich \ eingeb kommt nacher \\ raus.
Wiso?
Wie kann ich das ändern?

Gruß Ich
 
Das wird wohl an den Magic-Quotes liegen. Diese werden ueber die php.ini aktiviert/deaktiviert. Dies ist im Grunde eine der moeglichen "Sicherheitseinstellungen" in PHP welche aber nur bedingt nuetzlich ist.

Such mal hier im Forum danach, da solltest Du so einiges finden.

Ich hab auch vor einiger Zeit eine Funktion geschrieben die diese entfernt, aber eben auch nur falls die Option aktiv ist.
 
also das PHP macht aus " immer ein \", damit das nicht fehler im Script gibt. Um das zu verhindern gibt es diese praktische Funktion stripslashes();.
Damit kannst du die Backslashes entfernen lassen.
Also schreib einfach anstatt
PHP:
<?php echo $_POST["message"]; ?>
ein
PHP:
<?php echo stripslashes($_POST["message"]); ?>
hin, dann sollte es gehen.
 
also das PHP macht aus " immer ein \", damit das nicht fehler im Script gibt. Um das zu verhindern gibt es diese praktische Funktion stripslashes();.
Damit kannst du die Backslashes entfernen lassen.
Also schreib einfach anstatt
PHP:
<?php echo $_POST["message"]; ?>
ein
PHP:
<?php echo stripslashes($_POST["message"]); ?>
hin, dann sollte es gehen.
Und eben genau das ist der falsche Ansatz.
PHP escapet naemlich nicht immer, sondern eben nur wenn die Option magic_quotes_gpc in der php.ini auf on gesetzt ist. Entsprechend kann man auch nicht grundsaetzlich mit stripslashes() um sich schlagen.

Und bevor hier noch Verzweiflung oder gar Verwirrung aufkommt hier mal meine Funktion remove_magic_quotes(), welche eben nur stripslashes() nutzt wenn es auch wirklich angebracht ist.
PHP:
function remove_magic_quotes($string)
{
	if (get_magic_quotes_gpc())
		{
			$string=stripslashes($string);
		}
	return $string;
}

Wie gesagt, die Magic Quotes sind eines der etwas duemmeren "Sicherheitsfeatures" in PHP, denn dadurch wird, wie hier schoen zu sehen ist, dem User vorgegaukelt, dass PHP alles im Griff hat. Dass dadurch Probleme entstehen koennen wenn die Magic Quotes mal deaktiviert sind ist den meisten Usern garnicht bewusst.

In dem Zusammenhang moechte ich auch nochmal auf den Thread Sicherheit in PHP verweisen welcher einige nuetzliche Links und auch ein paar gute Tipps enthaelt.
 
Mal ne Frage wieso darf man das nicht ? bzw ist es so unperformant wenn man es trotz ausgeschaltetem magic_quotes trotzdem tut ?
Natürlich ist deine Fkt. eleganter aber es hört sich ziemlich kritisch an :)
 
Ich sehe die folgenden beiden Probleme dabei wenn man sich darauf verlaesst, dass die Magic Quotes an sind und sie dann doch mal aus sind:
  • Durch Einsatz von stripslashes() wenn keine Magic Quotes eingefuegt werden koennen gewollte Backslashes entfernt werden.
    Mal ein ganz einfaches Beispiel:
PHP:
<?php
echo stripslashes('la\la');
?>
  • Weiterhin gibt es eben ein Sicherheitsproblem in Sachen Uebergabewerte in SQL-Abfragen und Shell-Aufrufen
    Die Magic Quotes wurden eingefuehrt um automatisch bestimmte Zeichen zu maskieren die durch Angreifer genutzt werden koennen um eigene Befehle in SQL oder die Shell einzuschleusen.
    Wenn man sich nun darauf verlaesst dass PHP alles von selbst regelt ist man in dem Fall wirklich verlassen wenn die Magic Quotes aus sind, denn dann stehen zum Beispiel SQL-Injektionen alle Tore offen.
Es gibt sowohl fuer die Uebergabe an Datenbanken als auch an die Shell extra Escape-Funktionen. Und diese sollte man auch nutzen. Nur muss man eben bei Bedarf erstmal die Magic Quotes entfernen. Dafuer meine Funktion.

Bei mir werden Daten die an die Datenbank gehen erst mit remove_magic_quotes() bearbeitet und anschliessend mit der Funktion fuer die entsprechende Datenbank (bei MySQL ist dies mysql_real_escape_string()) escapet.
In dem Fall ist der Code absolut unabhaengig von den Magic Quotes.
 
Nichts zu danken.

Es arbeitet ja auch nicht jeder schon ein paar Jahre mit PHP. Und das Problem mit PHP sind eben Funktionen wie z.B. die Magic Quotes. Wenn man es gewohnt ist, dass diese immer gesetzt werden dann nimmt man das einfach als gegeben hin.
Es kramt ja auch nicht jeder in der php.ini rum. ;)

Wie ja bereits oft genug angesprochen wurde wird es Einsteigern mit PHP recht einfach gemacht unsauberen Code zu schreiben der unter gewissen Umstaenden gut laeuft, aber unter anderen Umstaenden einfach nicht funktioniert (wenn man Glueck hat, siehe z.B. register_globals) oder aber zu gravierenden Sicherheitsluecken fuehren kann (wenn man Pech hat, wie eben hier mit den Magic Quotes).

Wie gesagt, das sind Sachen die man mit der Zeit lernt. Ich (und natuerlich auch so einige andere User hier) versuche immer darauf zu achten, dass ich hier portablen Code poste, der eben unabhaengig von solchen Einstellungen oder irgendwelchen Extensions (siehe z.B. meine HTTP- und meine FTP-Klasse) ist.

Und ich hab zu Beginn meiner PHP-Zeit auch absolut schrecklich gecodet muss ich zugeben. Wenn ich mir den Code von meiner Videodatenbank von damals heute nochmal ansehen wuerde muesste ich wahrscheinlich brechen. ;)
 
Hallo!

Hab das selbe Problem, allerdings auf eine andere art und weise, ich möchte etwas in eine datei hineinschreiben, kann mir jemand bitte genau erklären was ich machen muss?

hier meine codes;
hier schreibe ich die datei:
PHP:
<form method="post" action="change.php">
  <p>Du möchtest die <b><?php echo $_POST['site']; ?></b> bearbeiten:<br />
  <textarea rows="10" cols="50" name="text"><?php include($_POST['site']); ?></textarea><br />
  Speichern unter:<br />
  <input type="text" name="name" value="<?php echo $_POST['site']; ?>"><br />
  <input type="submit" value="Bearbeiten"></form>

und hier wird die dann eingetragen:
PHP:
  <?php 
    $neu = fopen ($_POST['name'],"w+"); 
    fwrite($neu,$_POST['text']); 
    fclose($neu); 
?>

falls das mit dieser function geht, hoffe ich das mir jemand genau erklären kann wie.

liebe grüße
 
Zurück