ok, hat sich erledigt Besten Dank nochmal
Ankündigung
Einklappen
Keine Ankündigung bisher.
Was bedeutet '".$Variable."' ?
Einklappen
Neue Werbung 2019
Einklappen
X
-
auch htmlentities() und mysql_real_escape_string() sind unterschiedliche Funktionen mit unterschiedlichen Aufgabenbereichen.
Die mysql-Datenbank stört sich nicht an html-Code. Den willst Du nur loswerden, weil er bei der Ausgabe per html Deine Seitenstruktur stören oder Schadcode enthalten kann.
Aber das ist nur ein Problem der HTML-Ausgabe/Anzeige. Wenn Du es Dir mit einem Texteditor ansiehst oder als Postscript oder weiss der Geier was, ist es völlig egal, ob da nun html-Code in der Datenbank gespeichert wurde.
Immer drüber nachdenken, warum etwas angewendet wird und aus welchem Grund in welchem Anwendungsbereich.
Kommentar
-
ja das ist mir schon klar. Aber ich will eben beides verhindern. Code Injection und eben auch dass HTML Code ausgeführt wird.
Wenn ich jetzt zuerst htmlentities($text, ENT_NOQUOTES) anwende und anschliessend mysql_real_escape_string($text), dann werden die " und ' leider nicht maskiert, obwohl ich sie bei htmlentities extra nicht konvertiere.
Warum werden die " und ' dann nichtmehr erkannt?
Ich will dann eigentlich dass letztendlich in meiner Datenbank die " und ' und \ maskiert vorliegen, und die HTML-Tags eben in ihren Entities.
Kommentar
-
-
PHP-Code:<?php
function bearb($value)
{
echo"ohne irgendwas: $value
";
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
echo"nach stripsl: $value
";
$value=htmlentities($value, ENT_NOQUOTES);
echo"nach htmlent: $value
";
$value = "'" . mysql_real_escape_string($value) . "'";
echo"nach stripsl, htmlent, escap: $value
";
return $value;
}
?>
dann wird der Wert an den Query übergeben:
PHP-Code:<?php
$query = sprintf("UPDATE xxx SET UserOrt=%s WHERE UserSession='".session_id()."' LIMIT 1", bearb($ort));
mysql_query($query) or die (mysql_error());
?>
- ohne irgendwas: \"reutlingen\" \'teest\' ? \\</td> test
nach stripsl: "reutlingen" 'teest' ? \</td> test
nach htmlent: "reutlingen" 'teest' ? \</td> <b>test</b>
nach stripsl, htmlent, escap: '\"reutlingen\" \'teest\' ? \\</td> <b>test</b>'
Ort zurückgegeb Wert: '\"reutlingen\" \'teest\' ? \\</td> <b>test</b>'
und in der Datenbank steht dann leider nur das:
"reutlingen" 'teest' ? \</td> <b>test</b>
also ohne Maskierung, und das führt dazu dass nichts ausgegeben wird.
als Eingabe hab ich folgendes vorausgesetzt: (Wird vom Formular an $ort übergeben)
"reutlingen" 'teest' ? \</td> test
Der HTML-Code hat natürlich hier keinen Sinn..nur zum testen wie er behandelt wird.
Kommentar
- ohne irgendwas: \"reutlingen\" \'teest\' ? \\</td> test
-
und in der Datenbank steht dann leider nur das:
Kommentar
-
*löl* soso, elektronische Mülltonne. Besser als garnichts.
Ich hätte vielleixht dazu sagen sollen, dass ich als Eingabe folgendes vorausgesetzt habe: (Wird vom Formular an $ort übergeben)
"reutlingen" 'teest' ? \</td> test
Die HTML-Fetzen kommen nur daher, weil ich ausprobieren wollte ob die HTML-Tags korrekt umgesetzt werden durch htmlentities.
Ansonsten haben die keine Funktion und gehören auch nicht zum programm. Nur zu Testzwecken....
Kommentar
-
als Ausgabe krieg ich dann das:
ohne irgendwas: \"reutlingen\" \'teest\' ? \\</td> test
nach stripsl: "reutlingen" 'teest' ? \</td> test
nach htmlent: "reutlingen" 'teest' ? \</td> <b>test</b>
nach stripsl, htmlent, escap: '\"reutlingen\" \'teest\' ? \\</td> <b>test</b>'
Ort zurückgegeb Wert: '\"reutlingen\" \'teest\' ? \\</td> <b>test</b>'
und in der Datenbank steht dann leider nur das:
"reutlingen" 'teest' ? \</td> <b>test</b>
also ohne Maskierung, und das führt dazu dass nichts ausgegeben wird
Ok, anderes Beispiel:
Du willst in einem php-Skript ein Zeichenkettenliteral ausgeben, das sowohl ' als auch " enthält. Wie machst Du das (ohne heredoc)?
PHP-Code:<?php echo 'lalala ' blub " tralala'; ?>
PHP-Code:<?php echo 'lalala \' blub " tralala'; ?>
Genauso ist das bei mysql auchPHP-Code:<?php
mysql_query("INSERT INTO a VALUES('lalala ' blub')"); ?>
'lalala \' blub' <- so geht's, der \ wird aber nicht abgespeichert.
Kommentar
-
hmm ok, das ist auch wieder wahr.
Also, der User soll seine Daten selber ändern können. Dazu wird ein Formular angezeigt, das schon die bisherigen Daten enthält. Das sieht bei mir so aus:
PHP-Code:<?php
$sql="SELECT UserOrt FROM xxx WHERE UserSession='".session_id()."' LIMIT 1";
$result1= mysql_query($sql);
$row1 = mysql_fetch_array($result1);
echo"
<tr>
<td>Wohnort:</td>
<td><input type=text name=ort value=$row1[UserOrt]></td>
</tr>
";
?>
Wie kann ich das umgehen?
Kommentar
-
Zitat von saibotIch hätte vielleixht dazu sagen sollen, dass ich als Eingabe folgendes vorausgesetzt habe: (Wird vom Formular an $ort übergeben)
"reutlingen" 'teest' ? \</td> test
Die HTML-Fetzen kommen nur daher, weil ich ausprobieren wollte ob die HTML-Tags korrekt umgesetzt werden durch htmlentities.
Verwende einfach htmlentities($string, ENT_QUOTES). Das entschärft alles.
Besser wäre allerdings, wenn Du strip_tags ($string) verwenden würdest. " und ' entschärfst Du dann mit mysql_escape_string. Dann hat die liebe Seele Ruh.[/img]
Kommentar
-
Zitat von meikelHuch? In was für einer Gegend wohnst Du denn?
Laß Dir sowas nicht unterschieben. Und wenn, dann nur einfache Formatierungstags ala HTML 3.20. Ganz böse wären SCRIPT Tags, egal ob PHP oder JS, iframe
Ich hätte lieber hier auch htmlentities verwendet, aber da kann man keine Ausnahmen festlegen. Du sagst dass SCRIPT Tags böse wären. Werden die von strip_tags() erkannt und rausgefiltert? Falls nicht, wie werd ich die denn dann los?
" und ' entschärfst Du dann mit mysql_escape_string. Dann hat die liebe Seele Ruh.
Kommentar
-
Nerv ich schon?
Bei einem Ortsnamen haste doch keine Probleme:
alle Buchstaben, /, . und -
Geprüft wird mit preg_match() von Stringanfang bis Stringende. Eventuelle Leerzeichen killste vorher mit str_replace raus.
Hehe..Deutschland->Baden-Württemberg->Stuttgart->Reutlingen
Ok, also für ein Eingabefeld hab ich hab NUR strip_tags verwendet, da man hier Ausnahmen festlegen kann, wie z.b. oder <a></a>.
Ich hätte lieber hier auch htmlentities verwendet, aber da kann man keine Ausnahmen festlegen.
Kommentar
Kommentar