CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
PHP Grundlagen Hier kann über grundlegende Probleme oder Anfängerschwierigkeiten diskutiert werden |
01.09.2009, 23:46:52
|
Anfänger
|
|
Registriert seit: Mar 2009
Alter: 37
Beiträge: 46
|
|
htmlspecialchars() vor oder nach DBspeicherung (und andere Kleinigkeiten)
ich arbeite nun schon nen ganzes Stück mit PHP, aber hab mir darüber noch nie Gedanken gemacht ;)
ich hoff ich bekomm jetzt keinen Forenverweis, wegen unglaublicher Dummheit *fgg
und zwar folgendes:
Frage 1
bis jetzt hab ichs immer so gemacht, dass ich vorm Speichern in die DB htmlspecialchars() angewendet hab...so wird der Text gleich formatiert und ich kann ihn sorgenfrei ausgeben
jetzt kam mir aber der Gedanke, dass wenn man bei einer Registrierung den Namen auf 10 Zeichen beschränkt man in der Datenbank ja auch nur 10 maximale Zeichen angeben brauch
abgesehen davon, dass ich solche irrsinnigen Benutzernamen mit sämtlichen Sonderzeichen verabschäue gibt es doch immer wieder solche Spezies, die ihren Benutzernamen schmücken
z.B.
<<Troll>> [9 Zeichen, würde also passen]
in die Datenbank speichert er es aber als <<Troll>>
ok....da ist noch nicht das Problem....ich kann auch normal speichern und erst bei der Ausgabe htmlspecialchars() verwenden.
ABER
wenn ich das mach, hab ich das Problem bei Formularen...angenommen jemand gibt 11 Zeichen mit Sonderzeichen bei seinem Benutzernamen an....dann kommt eine schicke Fehlermeldung "Name zu lang", aber der eingegebene Name bleibt trotzdem im Input-Feld vorhanden.
Beim Ausgeben im Input-Feld muss ich jedoch auch htmlspecialchars() verwerden, sonst könnte man ja einfach das Input-Feld schließen und bißl Murx schreiben.
Wenn der Benutzer seinen Namen korrigiert hat und erneut abschickt, werden die Werte aus dem Input-Feld genommen, also wieder <<Troll>>, obwohl es ordnungsgemäß angezeigt wird. Dann müßte ich htmlspecialchars() vor dem Speichern erst wieder Rückgängig machen, damit es auch korrekt gespeichert wird.
wenn man im Textfeld jetzt aber Codezeilen eingeben will (also z.B. irgend was mit &), dann gibts hier wieder das Problem, dass WENN man htmlspecialchars() vor dem Speichern rückgängig macht (weil man ja will, dass der Text wie er angezeigt wird gespeichert wird), aus & ein & wird. Der Benutzer der dann den Text liest (sei es als PN oder als Forenbeitrag) wird wie gesagt nur, dass & sehen, obwohl & gewollt war.
(PS: ich weiß, dass es den HTML-Tag "CODE" gibt, aber der soll auch nur dafür verwendet werden und nicht nur für ein Wort ;) )
Ich hoff es gibt noch jemanden der bis hierhin durchgeblickt hat...vllt hab ichs komplizierter erklärt als es ist.....bin damit leicht überfordert.....n guter Rat würde mir sehr helfen ;)
Frage 2 (bezieht sich im Endeffekt auf Frage 1)
wenn ich zb & direkt eingebe, macht der daraus (obwohl htmlspecialchars() oder htmlentities() verwendet wurde) ein &. Ich könnte eine Funktion basteln die aus & ein &amp; macht, aber wie beim oben angesprochenen Problem wird mit jeder Eingabe mit einem zusätzlichen & wieder ein &amp; und daraus ein &amp;amp; usw.
Jetzt könnte ich eine Funktion basteln die das filtert, also aus &amp; & macht.....aber dann könnte man auch wieder die Sachen eingeben die gefiltert werden und das geht ewig so weiter. Und so ein hin und her will ich mir auch ersparen
meine Frage: wie bekomm ich das gespeichert, was eingegeben wird......was man aber so ausgeben kann, dass es ordentlich angezeigt wird?
EDIT: ok, wenn ichs bei der Ausgabe mach funktionierts..... wenn ich die $_POST Variable mit htmlspecialchars() verseh, als Variable speicher und dann ausgeb funktionierts nich....soll mal einer verstehen
oar das is so verwirrend ^^
Meine Frage
Geändert von Big-Gremlin (02.09.2009 um 00:12:33 Uhr)
|
02.09.2009, 00:24:29
|
Anfänger
|
|
Registriert seit: Mar 2009
Alter: 37
Beiträge: 46
|
|
AW: htmlspecialchars() vor oder nach DBspeicherung (und andere Kleinigkeiten)
sry für Doppelpost:
aber
Zitat:
EDIT: ok, wenn ichs bei der Ausgabe mach funktionierts..... wenn ich die $_POST Variable mit htmlspecialchars() verseh, als Variable speicher und dann ausgeb funktionierts nich....soll mal einer verstehen
|
kann ignoriert werden.....handelte sich um ein Versehen...
kann den Beitrag aber nicht mehr editieren (30Minuten nach Erstellung gehts nimmer)
|
02.09.2009, 09:10:23
|
SELFPHP Experte
|
|
Registriert seit: Jun 2008
Alter: 16
Beiträge: 2.269
|
|
AW: htmlspecialchars() vor oder nach DBspeicherung (und andere Kleinigkeiten)
Sind denn jetzt alle Klarheiten beseitigt?
|
02.09.2009, 15:29:56
|
Anfänger
|
|
Registriert seit: Mar 2009
Alter: 37
Beiträge: 46
|
|
AW: htmlspecialchars() vor oder nach DBspeicherung (und andere Kleinigkeiten)
ja alle Klarheiten sind weg....
wäre gut wenn die Unklarheiten beseitigt werden würden und die Klarheiten wieder auftauchen ;D
mit meinem 2ten Post meinte ich nur das "EDIT" aus dem ersten, welches ignoriert werden kann
|
02.09.2009, 15:39:00
|
SELFPHP Experte
|
|
Registriert seit: Jun 2008
Alter: 16
Beiträge: 2.269
|
|
AW: htmlspecialchars() vor oder nach DBspeicherung (und andere Kleinigkeiten)
Ich weiß gar nicht wo dein Problem ist.......
Gehen wir es mal logisch an:
Wer stellt HTML dar?
Richtig der Browser!
Also machen die html*() Funktionen nur bei Daten Sinn, welche zum Browser gesendet werden.
Ist das jetzt erstmal klar?
Damit dir die Daten aus Formularen nicht das SQL Statement zerschießen, oder gar SQL Injections ermöglichen, muß man diese Daten oft escapen. aber nicht immmer. Das ist u.A. abhängig davon, welche DB Schnittstelle genutzt wird. Befrage das jeweilige Handbuch dazu.
Sonst noch was?
Ja, der Zeichensatz!!
Behalte immer unter Kontrolle, in welchem Zeichensatz deine Daten vorliegen.
|
02.09.2009, 16:03:23
|
Anfänger
|
|
Registriert seit: Mar 2009
Alter: 37
Beiträge: 46
|
|
AW: htmlspecialchars() vor oder nach DBspeicherung (und andere Kleinigkeiten)
SQL Injection is nich möglich, da PDO mit prepared Statements
der Zeichensatz ist ÜBERALL Unicode (in der Datenbank, in den Datenbankfeldern, in den HTML/PHP-Dateien)
das Problem liegt zum einen bei Input-Feldern:
Wenn ich einen Text eingeb, kann ich den selbstverständlich wie erst an MySQL senden. ABER wenn der Text einen Fehler beinhaltet (angenommen beim Benutzernamen), dann soll der Text auch nach dem Absenden wieder im Input-Feld stehen (zum einen hab ich das schon mit JavaScript gemacht, aber die Seite soll ja auch komplett ohne JS funktionieren). Damit ich den im Inputfeld eingegeben Text ordentlich anzeigen lassen kann muss ich ihn formatieren, sonst könnte ja jemand " /> bla bla bla schreiben und die Optik der Seite (zumindest für sich selbst) zerstören oder JavaScripts einbauen
wenn er jetzt erneut absendet werden die Daten aber trotzdem formatiert gesendet, da man ja das abschickt was innerhalb des Input-Feldes steht und nach einer fehlerhaften Eingabe muss wie gesagt zur korrekten Darstellung die Ausgabe formatiert werden
Also müßte ich vor absenden nochmal eine Funktion bauen die eine der HTML*()-Funktionen rückgängig macht
da kommt Problem 2 ins Spiel
wenn ich das mache, dann kann man solche Eingaben wie & auch nicht machen, weil dann daraus automatisch ein & wird
das Hauptproblem ist also
Ausgefüllte Input-Felder bei fehlerhaften Eingaben, da diese formatiert sein müssen, damit der Benutzer die Seite nicht zerstört (zumindest für sich selbst), aber beim Speichern die Formatierung rückgängig gemacht werden muss, das aber wiederrum nicht geht, da ein Benutzer eventuell auch mal paar Codezeilen absenden will (die aber auch nach fehlerhafter Eingabe uncodiert an die Datenbank gesendet werden sollen)
vllt mach ich mir auch Probleme wo keine sind....mir is schon klar, dass ne Formatieruug bei der Ausgabe sinnvoller is....wenn ich da nich dieses Problemchen hätte
|
02.09.2009, 16:23:16
|
SELFPHP Experte
|
|
Registriert seit: Jun 2008
Alter: 16
Beiträge: 2.269
|
|
AW: htmlspecialchars() vor oder nach DBspeicherung (und andere Kleinigkeiten)
Weiterhin...
Die HTML*() nur unmittelbar vor der Ausgabe ins HTML anwenden.
Fertig!
Sonst nichts!
Zitat:
vllt mach ich mir auch Probleme wo keine sind...
|
Ja!
Lass das JS Gedöns erstmal weg..
|
02.09.2009, 17:05:36
|
Anfänger
|
|
Registriert seit: Mar 2009
Alter: 37
Beiträge: 46
|
|
AW: htmlspecialchars() vor oder nach DBspeicherung (und andere Kleinigkeiten)
*lach ich glaub du verstehst mich grad bißl falsch
das JS-Gedöns funktioniert wunderbar...da liegt nicht das Prob ;)
es geht darum es OHNE JS-Gedöns zu lösen.... ich schicke ein Formular ab und kann die Daten direkt speichern (das funktioniert)
aber wir reden aneinander vorbei
ich versuchs anders
Code:
<form action="" method="post">
<input type="text" name="blubb" value="<?php echo(htmlspecialchars($_POST[blubb])); ?>" />
<input type="submit" name="wech" />
</form>
Nach fehlerhafter Eingabe, siehts im Quelltext so aus: <b><?php echo(htmlspecialchars(htmlspecialchars($_POST[blubb]))); ?></b>
man nehme diesen simplen Code
selbstverständlich kann ich das POST gleich so (unformatiert) absenden und in die Datenbank speichern
hiermit simulier ich aber, was passiert wenn die Eingabe fehlerhaft war
unten steht bewust 2mal htmlspecialchars, damit man gleich sieht was im Quellcode steht ohne diesen zu öffnen
wie man sieht, wird da aus nem & ein & (rein optisch sieht mans nicht, aber im Quelltext steht es, somit wird es auch mit dieser Formatierung abgesendet)
oder sendet er es so ab wie mans sieht, anstatt das was im Quelltext bei "value" steht? weil dann wäre hier mein Denkfehler
Code:
<input type="text" name="blubb" value="&" />
quasi wenn das obrige nach fehlerhafter Eingabe in Quellcode steht, dann wird nur ein & gesendet?
|
02.09.2009, 17:12:19
|
SELFPHP Experte
|
|
Registriert seit: Jun 2008
Alter: 16
Beiträge: 2.269
|
|
AW: htmlspecialchars() vor oder nach DBspeicherung (und andere Kleinigkeiten)
Zitat:
oder sendet er es so ab wie mans sieht, anstatt das was im Quelltext bei "value" steht? weil dann wäre hier mein Denkfehler
|
Ja!
Beweis:
PHP-Code:
<?php
error_reporting(-1);
ini_set('display_errors', TRUE);
$zeichensatz = 'utf-8';
// $value vorbereiten
$value = '';
if(isset($_POST['eingabe']))
if(get_magic_quotes_gpc())
$value = stripcslashes($_POST['eingabe']);
else $value = $_POST['eingabe'];
// Vorbereiten zur Ausgabe
$ausgabe = htmlspecialchars($value,ENT_COMPAT,$zeichensatz);
$quellcodeausgabe = htmlspecialchars($ausgabe,ENT_COMPAT,$zeichensatz);
$countbytes = strlen($value);
$countchars = mb_strlen($value,$zeichensatz);
$countquellbytes = strlen($ausgabe);
// Ausgabe
header("Content-Type: text/html; charset=$zeichensatz");
?>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=<?php echo $zeichensatz?>">
<title>Formtestfeld</title>
</head>
<body>
<form accept-charset="<?php echo $zeichensatz?>" action="" name="testorm" method="post">
<input type="text" name="eingabe" value="<?php echo $ausgabe ?>">
<input type="submit">
</form>
<hr>
<?php
if(isset($_POST['eingabe']))
{
echo "Das was der Browser zu sehen bekommt: $quellcodeausgabe <br>\r\n";
echo "Und was er dir zeigt: $ausgabe <br>\r\n";
echo "Länge des Value Strings in chars: $countchars <br>\r\n";
echo "Länge des Value Strings in bytes: $countbytes <br>\r\n";
echo "Länge des Quellcodes in bytes: $countquellbytes <br>\r\n";
}
?>
</body>
</html>
|
02.09.2009, 17:22:36
|
Anfänger
|
|
Registriert seit: Mar 2009
Alter: 37
Beiträge: 46
|
|
AW: htmlspecialchars() vor oder nach DBspeicherung (und andere Kleinigkeiten)
ahh...wieder was dazu gelernt ;)
und ich dachte es wird so gesendet wie es im Quellcode ankommt....vielen Dank für die Geduld ;)
jetzt kann ich beruhigt meinen Quellcode umschreiben
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 23:04:51 Uhr.
|