SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



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



:: Buchempfehlung ::

Webseiten professionell erstellen

Webseiten professionell erstellen zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > PHP Grundlagen
Hilfe Community Kalender Heutige Beiträge Suchen

PHP Grundlagen Hier kann über grundlegende Probleme oder Anfängerschwierigkeiten diskutiert werden

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 01.09.2009, 23:46:52
Big-Gremlin Big-Gremlin ist offline
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 &lt;&lt;Troll&gt;&gt;

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 &lt;&lt;Troll&gt;&gt;, 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 &amp;), 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 &amp; ein & wird. Der Benutzer der dann den Text liest (sei es als PN oder als Forenbeitrag) wird wie gesagt nur, dass & sehen, obwohl &amp; 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 &amp; direkt eingebe, macht der daraus (obwohl htmlspecialchars() oder htmlentities() verwendet wurde) ein &. Ich könnte eine Funktion basteln die aus &amp; ein &amp;amp; macht, aber wie beim oben angesprochenen Problem wird mit jeder Eingabe mit einem zusätzlichen &amp; wieder ein &amp;amp; und daraus ein &amp;amp;amp; usw.

Jetzt könnte ich eine Funktion basteln die das filtert, also aus &amp;amp; &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)
Mit Zitat antworten
  #2  
Alt 02.09.2009, 00:24:29
Big-Gremlin Big-Gremlin ist offline
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)
Mit Zitat antworten
  #3  
Alt 02.09.2009, 09:10:23
DokuLeseHemmung DokuLeseHemmung ist offline
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?
Mit Zitat antworten
  #4  
Alt 02.09.2009, 15:29:56
Big-Gremlin Big-Gremlin ist offline
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
Mit Zitat antworten
  #5  
Alt 02.09.2009, 15:39:00
DokuLeseHemmung DokuLeseHemmung ist offline
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.
Mit Zitat antworten
  #6  
Alt 02.09.2009, 16:03:23
Big-Gremlin Big-Gremlin ist offline
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 &amp; 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
Mit Zitat antworten
  #7  
Alt 02.09.2009, 16:23:16
DokuLeseHemmung DokuLeseHemmung ist offline
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..
Mit Zitat antworten
  #8  
Alt 02.09.2009, 17:05:36
Big-Gremlin Big-Gremlin ist offline
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 &amp; (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="&amp;" />
quasi wenn das obrige nach fehlerhafter Eingabe in Quellcode steht, dann wird nur ein & gesendet?
Mit Zitat antworten
  #9  
Alt 02.09.2009, 17:12:19
DokuLeseHemmung DokuLeseHemmung ist offline
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>
Mit Zitat antworten
  #10  
Alt 02.09.2009, 17:22:36
Big-Gremlin Big-Gremlin ist offline
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
Mit Zitat antworten
Antwort


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.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu


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


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt