php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 13-08-2015, 23:45
Truncate
 Registrierter Benutzer
Links : Onlinestatus : Truncate ist offline
Registriert seit: Nov 2005
Beiträge: 419
Truncate kann nur auf Besserung hoffen
Standard Reihenfolge von htmlspecialchars(), strip_tags() und trim()?

Hallo,

ich will aus dem $_POST-Array diverse Dinge filtern/ersetzen und nutze aktuell diesen Code:

PHP-Code:
$_POST array_map('htmlspecialchars'array_map('strip_tags'array_map('trim'$_POST))); 
Macht diese Reihenfolge so Sinn?

Können nicht ev. durch strip_tags() erneut links oder rechts vom String Leerzeichen entstehen?

Danke!
Mit Zitat antworten
  #2 (permalink)  
Alt 14-08-2015, 00:55
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

strip_tags macht so gut wie nie Sinn.

Und wie hilfreich oder nicht die anderen zwei sind, hängt davon ab, was du eigentlich erreichen willst.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #3 (permalink)  
Alt 14-08-2015, 00:57
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.593
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Ich würde die Funktionen dort verwenden, wo sie erforderlich sind.

htmlspecialchars() gehört in die HTML-Ausgabe und hat bei der POST-Verarbeitung nichts verloren.

strip_tags() macht nur dann Sinn, wenn du gezielt HTML-Code herausfiltern möchtest, was in 99,9% der Fälle unnötig ist und nur die Daten verstümmelt.

trim() brauchst du dann, wenn du Whitespaces am Anfang und Ende von Strings entfernen möchtest. Das kann bei Eingaben in Textfeldern sinnvoll sein.
Mit Zitat antworten
  #4 (permalink)  
Alt 14-08-2015, 01:00
Truncate
 Registrierter Benutzer
Links : Onlinestatus : Truncate ist offline
Registriert seit: Nov 2005
Beiträge: 419
Truncate kann nur auf Besserung hoffen
Standard

Ich will ein typisches Kontaktformular "filtern".

Name, Straße, Ort, PLZ, eMail-Adresse...

Da könnte ich jetzt natürlich überall Regexes benutzen, aber z.B. bei der Straße gibt's ja sonstwas für Namen mit Bindestrich, Apostroph, c/o usw.

Deswegen soll eigentlich nur HTML raus sowie Leerzeichen...
Mit Zitat antworten
  #5 (permalink)  
Alt 14-08-2015, 01:05
Truncate
 Registrierter Benutzer
Links : Onlinestatus : Truncate ist offline
Registriert seit: Nov 2005
Beiträge: 419
Truncate kann nur auf Besserung hoffen
Standard

Zitat:
Zitat von h3ll Beitrag anzeigen
strip_tags() macht nur dann Sinn, wenn du gezielt HTML-Code herausfiltern möchtest, was in 99,9% der Fälle unnötig ist und nur die Daten verstümmelt.
Wie macht man es dann, wenn z.B. der Name in der Datenbank gespeichert wird (incl. HTML und Javascripts) und dann irgendwann mal bei der Generierung einer HTML-Rechnung wieder abgerufen wird?

Ziel soll ja sein, dass der Name gleich von Anfang an "sauber" in der Datenbank landet.
Mit Zitat antworten
  #6 (permalink)  
Alt 14-08-2015, 01:16
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.593
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Truncate Beitrag anzeigen
Ich will ein typisches Kontaktformular "filtern".

Name, Straße, Ort, PLZ, eMail-Adresse...

Da könnte ich jetzt natürlich überall Regexes benutzen, aber z.B. bei der Straße gibt's ja sonstwas für Namen mit Bindestrich, Apostroph, c/o usw.

Deswegen soll eigentlich nur HTML raus sowie Leerzeichen...
Prinzipiell sollte $_POST nicht manipuliert werden. Betrachte $_POST als read-only. Filtere dort, wo es erforderlich ist. In dem Fall wohl bei der Formularverarbeitung.

Adressen mit strip_tags() zu filtern ist so wie Spaghetti mit Strumpfhosen abzugießen. Es tut irgendwie das, was man will, aber es ist nicht der richtige Weg. Wenn du filtern möchtest, dann solltest du vernünftige Filterregeln aufstellen. Dafür muss man sich eben mit den Daten beschäftigen und sich informieren, was sinnvoll ist uns was nicht.

Zitat:
Zitat von Truncate Beitrag anzeigen
Wie macht man es dann, wenn z.B. der Name in der Datenbank gespeichert wird (incl. HTML und Javascripts) und dann irgendwann mal bei der Generierung einer HTML-Rechnung wieder abgerufen wird?
Man beachtet den Kontextwechsel, was man immer tun sollte. Vertraue nie darauf, dass die Daten "sauber" sind!

In dem Fall verwendet man bei der HTML-Ausgabe (und nur dort!) htmlspecialchars(). In der Datenbank hat das nichts verloren. Dort gehören nur Rohdaten rein.
Mit Zitat antworten
  #7 (permalink)  
Alt 14-08-2015, 01:26
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

„Sauber“ hängt halt vom Ausgabekontext (HTML, CSV, PDF, …) ab. Die DB weiß aber in aller Regel nicht, was der Ausgabekontext ist. Oder: Es ergibt in aller Regel keinen Sinn, die Daten für einen bestimmten Ausgabekontext aufbereitet in der DB zu speichern, weil du damit einerseits die Daten verstümmelst (du kannst dann per SQL etwa nicht mehr nach „C&A“ suchen, sondern musst nach „C&A“ suchen, was inhaltlich wenig Sinn ergibt, weil die Firma nun mal „C&A“ heißt).

Zudem verbaust du dir durch derlei ausgabeformatspezifische Veränderungen auch die Chance, die Daten problemlos in einem anderen Ausgabekontext zu nutzen (wenn du etwa aus den Daten eine CSV-Datei oder ein PDF generieren möchtest – beide Formate kennen kein & als "&"-Zeichen, du müsstest dann umständlich erst mal rückkonvertieren).

Deshalb ist es fast immer geschickter, die Originaldaten unverändert abzuspeichern und erst während der Generierung der Ausgabe an den entsprechenden Ausgabekontext anzupassen.

E: Das waren längst nicht alle Argumente, das so zu machen.



Was ich in Sachen strip_tags immer ganz anschaulich finde: Du könntest einen Artikel schreiben mit dem Titel „Erklärungen zum <a>-Element“ oder eine Firma könnte den Namen „<meta> Webdesign“ haben oder so was in der Art. Das wäre eher blöd, wenn du darauf strip_tags anwendest, das dir dann die „vermeintlichen“ Tags raushaut, obwohl die normaler Inhalt sind.

Zitat:
Spaghetti mit Strumpfhosen abzugießen
Schönes Bild.

Geändert von mermshaus (14-08-2015 um 01:36 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 14-08-2015, 21:49
Truncate
 Registrierter Benutzer
Links : Onlinestatus : Truncate ist offline
Registriert seit: Nov 2005
Beiträge: 419
Truncate kann nur auf Besserung hoffen
Standard

Gut ich konkretisiere mal den Fall, würde echt gerne wissen wie Ihr das handhaben würdet...

Irgendwelche HTML-Codes sind nirgendwo nötig/optional, im Kontaktformular werden abgefragt:

- Name
- Adresse (Straße und Hausnummer)
- PLZ
- Ort
- E-Mail-Adresse

Alle Felder sind Pflichtfelder, bekommen also das Input-Attribut required.

Desweiteren wird pattern="[0-9]{4,5}" und maxlength="5" für die PLZ festgelegt, damit sind sämtliche PLZen aus DE/AT/CH abgedeckt.

Für die E-Mail-Adresse wird einfach type="email" festgelegt.

Sofern der Benutzer also einen HTML5-fähigen Browser besitzt, ist das Abschicken eines leeren Formulars nicht mehr möglich und PLZ sowie E-Mail-Adresse werden clientseitig schon mal vorab auf das richtige Format kontrolliert.

Ich hätte jetzt den Feldern Name, Adresse und Ort noch sowas wie pattern="[0-9A-zÀ-Üß-ü- ]+" verpasst, allerdings müßten da ja auch noch einige Sonderzeichen mehr rein wenn z.B. jemand "K&M" oder "Müller+Meier GmbH" schreibt etc.

Das wird wohl aber nichts werden, da diese Regex ev. zu "hart" ist und die Anfrage ja 100%ig ankommen soll

Was passiert nach dem Absenden? Die Felder werden mittels !empty() geprüft ob alle ausgefüllt, zusätzlich nochmals das Format von PLZ sowie E-Mail-Adresse.

Danach erfolgt eine Ausgabe im Browser ala "Vielen Dank ".$_POST['Name']." für Deine Anfrage!" und es wird eine HTML-E-Mail an $_POST['email'] mit den eingegebenen Daten geschickt.

Da die Ausgabe beide Male in HTML erfolgt, könnte ich doch diese 3er-Kombi benutzen oder?
Mit Zitat antworten
  #9 (permalink)  
Alt 14-08-2015, 22:08
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.593
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Truncate Beitrag anzeigen
Gut ich konkretisiere mal den Fall, würde echt gerne wissen wie Ihr das hDanach erfolgt eine Ausgabe im Browser ala "Vielen Dank ".$_POST['Name']." für Deine Anfrage!" und es wird eine HTML-E-Mail an $_POST['email'] mit den eingegebenen Daten geschickt.

Da die Ausgabe beide Male in HTML erfolgt, könnte ich doch diese 3er-Kombi benutzen oder?
Kontextwechsel beachten!

PHP-Code:
Vielen Dank <?php echo htmlspecialchars($_POST['Name'], ENT_QUOTES ENT_HTML5'UTF-8'); ?> für Deine Anfrage!
Mit Zitat antworten
  #10 (permalink)  
Alt 15-08-2015, 15:47
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

Zitat:
Irgendwelche HTML-Codes sind nirgendwo nötig/optional
Kam vermutlich schon in den Erklärungen durch, aber das ist eigentlich irrelevant, wenn man die Kontextwechsel alle passend beachtet. Dann kann in den Daten stehen, was will.

Zitat:
Sofern der Benutzer also einen HTML5-fähigen Browser besitzt, ist das Abschicken eines leeren Formulars nicht mehr möglich und PLZ sowie E-Mail-Adresse werden clientseitig schon mal vorab auf das richtige Format kontrolliert.
Ich sage es nur zur Sicherheit: Du musst natürlich dennoch alle Daten auch noch serverseitig prüfen, da HTTP-Requests von Nutzern (auch ohne Browser) beliebig aufgebaut und an den Server geschickt werden können.

Zitat:
Ich hätte jetzt den Feldern Name, Adresse und Ort noch sowas wie pattern="[0-9A-zÀ-Üß-ü- ]+" verpasst, allerdings müßten da ja auch noch einige Sonderzeichen mehr rein wenn z.B. jemand "K&M" oder "Müller+Meier GmbH" schreibt etc.
Dazu vertrete ich den Standpunkt: Wer Unsinn eintragen will, der schafft das so oder so. „Mordor Weltbeherrschung KGaA“ ist zum Beispiel nicht grundsätzlich weniger quatschig als irgendein Zeichensalat wie „×÷±∞π∅≤≥≠≈∧∨“. Quark bleibt halt Quark, auch wenn der eine Quark noch lesbarer ist. Würde mir deshalb gut überlegen, welche Gründe es gibt, die möglichen Zeichen wie zu reduzieren. (Das soll nicht suggerieren, dass derlei Gründe nicht existieren.)

Zitat:
Das wird wohl aber nichts werden, da diese Regex ev. zu "hart" ist und die Anfrage ja 100%ig ankommen soll
Joa, genau. So was ist gar nicht so leicht. Ich weiß da auch keine Patentlösung. „Alles erlauben“ ist aber erst mal besser als „nur ~100 Zeichen, die ich gerade passend fand, erlauben“, denke ich.

Zitat:
zusätzlich nochmals das Format von PLZ sowie E-Mail-Adresse.
Ah, gut. Damit wird der eine Hinweis oben mehr oder weniger hinfällig.

Zitat:
Da die Ausgabe beide Male in HTML erfolgt, könnte ich doch diese 3er-Kombi benutzen oder?
Nutz einfach beim Eintrag in die DB die Escaping-Funktion für den Kontextwechsel nach SQL und bei Ausgabe (und nicht vorher) als HTML die Escaping-Funktion für den Kontextwechsel nach HTML. Das ist Schema F, und das ist völlig üblich so.

Kontextwechsel nach SQL: Je nach Adapter zum Beispiel: mysqli_real_escape_string, PDO::quote, Prepared Statements, …
Kontextwechsel nach HTML: siehe hellbringer

Da es glaube ich noch niemand verlinkt hat: Schöne Artikel zum allgemeinen Thema Kontextwechsel:

- PHP/Anwendung und Praxis/Kontextwechsel ? SELFHTML-Wiki
- PHP/Anwendung und Praxis/Kontextwechsel/erkennen und behandeln ? SELFHTML-Wiki
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
strip_tags, substr und wieder tags rein Piremilok PHP Developer Forum 4 17-09-2008 12:56
strip_tags und PHP 4.3 Kropff PHP Developer Forum 3 02-12-2003 16:55
Reihenfolge von ORDER und LIMIT comm_a_nder SQL / Datenbanken 13 14-08-2003 17:41
umkehrung von htmlentities / htmlspecialchars i2dx PHP Developer Forum 11 14-02-2003 11:26

Themen-Optionen
Thema bewerten
Thema bewerten:

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 an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:57 Uhr.