mmofacts.com

HTML Einträge abfangen

gepostet vor 17 Jahre, 3 Monate von azamaroth
Hiho!
Ich habe hier eine kleine Aufgabenstellung die ich gerne lösen möchte.
Hintergrund:
Bei meinem Browsergame "Aysalia Arena" gibt es ein Schwarzes Brett, wo Spieler allgemeine Nachrichten für alle lesbar hinterlassen können. Die Einträge werden in einer Datenbank gespeichert.
Aufgabe:
HTML Tags sollen entfernt oder nur angezeigt und nicht ausgeführt werden bei der Ausgabe des Schwarzen Bretts.
Könnte mir da jemand kurz Hilfestellung geben, Anhaltspunkte, welche Anweisungen ich mir anschauen muss, würde mir auch schon reichen. Danke
gepostet vor 17 Jahre, 3 Monate von DrakeL
Fürs speichern:
Wenn ich HTML Tags (oder allgemein alle Tags) komplett verbieten will benutz ich immer "strip_tags()". Ansonsten solltest entweder eine Whitelist führen über alle erlaubten HTML Tags (niemals eine Blacklist!) oder gleich BBCode benutzen.
Fürs anzeigen:
siehe Beitrag über mit. Zum Speichern weniger geeignet, da die Sachen nicht immer in HTML ausgeben musst und die Entities mehr Platz benötigen.
gepostet vor 17 Jahre, 3 Monate von DrakeL
Haha ^^
PS (damit der Post nicht sinnlos ist ):
Ich würde die Methoden nicht direkt benutzen an all deinen Codestellen, sondern Sie in eine eigene Methode/Klasse packen. Vielleicht willst ja von allem verbieten mal auf BBCode wechseln oder so. Gerade hier halte ich es für wichtig schnell zentrale Änderungen vornehmen zu können, da das auch was mit der Sicherheit zu tun hat.
gepostet vor 17 Jahre, 3 Monate von SpeedyGTD
ich würde strip_tags nicht verwenden, da dort alles was zwischen < und > steht entfernt wird, das macht teilweise komplette sätze sinnlos oder entfernt von spielern angebrachte verzierungen (hatte ich bei mir zB. auf allypages).
gepostet vor 17 Jahre, 3 Monate von DrakeL
Original von SpeedyGTD
ich würde strip_tags nicht verwenden, da dort alles was zwischen < und > steht entfernt wird, das macht teilweise komplette sätze sinnlos oder entfernt von spielern angebrachte verzierungen (hatte ich bei mir zB. auf allypages).

Im normalen Sprachgebrauch nimmt man solche Zeichen ja auch nicht ^^. Falls mit Verzierungen erlaubten HTML Code meinst, dann nimm BBCode, ist am sinnvollsten und sichersten.
gepostet vor 17 Jahre, 3 Monate von SpeedyGTD
mit "Verzierungen" meinte ich die grafische verzierung (ohne irgendwelche tags) von zB. allianzseiten (meistens mit punkten, rauten, apostrophen usw)
>.-*`´*-.< <--sowas zB (sowas hat doch fast jeder schon mal irgendwo gesehen).
ganz davon abgesehen gibt es auch smilies die diese zeichen beinhalten.
bbcodes hab ich natürlich auch, nur bringt das nix wenn strip_tags vorher alles rauslöscht was man unter umsätndne formatieren will.
gepostet vor 17 Jahre, 3 Monate von DrakeL
Original von SpeedyGTD
>.-*`´*-.< <--sowas zB (sowas hat doch fast jeder schon mal irgendwo gesehen).

Bei mir würde in dem Falle der Text aus dem Control gelöscht werden und eine Meldung an den Benutzer ausgegeben, dass diese Zeichen nicht verwendet werden dürfen. Wenn ein Benutzer das ein paar mal macht bei größeren Texten die er dann neu schreiben muss lernt er es schon, dass er es nicht verwenden darf. ^^
Also ich sehe kein Sinn darin solche unnötigen Verzierungen zu erlauben. Und "Standardsmilies" haben keine solche Zeichen darin.
(Merkt man dass ich solche Verzierungen nicht leiden kann *ironisch frag* ^^)
Aber ansonsten sollte es natürlich auch mit der anderen Methode funktionieren, mit der kann man ja Sonderzeichen (< und > gehören da ja dazu) umwandeln in Ihre Entsprechungen und es würde dann auch so angezeigt werden.
Vielleicht änder ich das bei mir dann auch mal zentral, so aus reiner Benutzerfreundlichkeit. ^^
gepostet vor 17 Jahre, 3 Monate von Todi42
Die Frage ist doch eher, warum man so etwas verbieten möchte. Bei Financial Rumors, werden alle Beiträge, so wie sie vom client kommen in die Datenbank geschrieben. Wenn sie dann wieder zurück an den client geschickt werden, werden alle HTML Sonderzeichen entsprechend escaped und damit genau so dargestellt, wie der Benutzer sie eingegeben hat.
gepostet vor 17 Jahre, 3 Monate von DrakeL
Bei mir aus Gründen der Sicherheit.
Woher kommen alle Benutzerdaten bei mir? Nur über Formulare. Daher meine Formularklasse übernimmt die Validerung automatisch.
Wo werden die Daten bei mit verwendet? Keine Ahnung wo überall, an mehreren Stellen auf jeden Fall.
Auf diese Weise ist es für mich wesentlich einfacher (und auch sicherer) den einen Eingang abzusichern und möglichen Schadcode zu entfernen, als an allen Stellen, wo ich solche Daten verwende abzusichern und vielleicht auch eine Stelle dabei vergesse.
Und zentrale Sicherheit ist für mich ein verdammt guter Grund, solche Verzierungen zu verbieten
Hier im Forum wäre es natürlich fatal, da man sonst keine Quellcodes mehr posten könnte. ^^
gepostet vor 17 Jahre, 3 Monate von Agmemon
In dem Bereich gibt e übrigens zwei "Best Practices":
1. In PHP nicht direkt auf die globalen Variablen zugreifen (also $_ET und $_POST, usw.), sondern das ganze in einem RequestHelper kapseln. Dabei werden dann alle Variablen beim Start des Requests in einer HashMap gespeichert. Über einen Getter greift man dann darauf zu und implementiert darin gleich seine sanitize Funktionen. So ist sichergestellt, dass man nicht vergisst.
2. Wie Todi es macht: HTML erst bei der Anzeige escapen. Das hat vor allem Vorteile, wenn man was an den White- und Blacklists ändert.
gepostet vor 17 Jahre, 3 Monate von Todi42
Original von DrakeL
könnte. ^^

Naja, in einem Mathematik-Forum, könnte man Ungleichungen nicht mehr Diskutieren und Ascii-Arts wären auch nur noch eingeschränkt möglich. Viele Anwender eines Forums kennen wahrscheinlich HTML garnicht und für die sind dann solche Einschränkungen doch recht unintuitiv.
ist ein Eigenschaft von Software, die nur schwer meßbar und sehr subjektiv ist. Und wenn zentral etwas am Input geändert werden kann, warum dann nicht auch zentral am Output?
gepostet vor 17 Jahre, 3 Monate von SpeedyGTD
Original von Agmemon
2. Wie Todi es macht: HTML erst bei der Anzeige escapen. Das hat vor allem Vorteile, wenn man was an den White- und Blacklists ändert.

so mach ich es auch, vor allem auch weil es mehrere ausgabewege gibt (zB. auch irc).
lediglich so sachen wie sql injections verhinder ich vor dem eintragen, bzw esacpe ich vorher.
vor allem aber auch weil ich niemandem vorschreiben will, welche zeichen er wo verwenden darf, bzw es nicht darf.
gepostet vor 17 Jahre, 3 Monate von Sh1nto
Wir geben die Sachen genau so aus wie der Benutzer sie eingibt, dafür benutzen wir beim Speichern der Werte dei funktion htmlspecialchars
de.php.net/manual/en/function.htmlspecialchars.php
An den Stellen, wo wir was erlauben (Farbe, Bilder, Schriftaret,...), lassen wir BBCode zu, was davon nicht beinträchtigt wird,...
HTML ist einfach Tabu bei uns. Da bei uns alle Eingaben so gespeichert werden, können wir z.B. Admin-Meldungen mit HTML formatieren,...
gepostet vor 17 Jahre, 3 Monate von DrakeL
Original von Todi42
ist ein Eigenschaft von Software, die nur schwer meßbar und sehr subjektiv ist. Und wenn zentral etwas am Input geändert werden kann, warum dann nicht auch zentral am Output?

Sehr gute Frage... Ich hab Klassen, die sich um die Anzeige verschiedener Daten kümmern. Bisher wird diese aber nur in den HTML Tabellen benutzt.
Ok ich hab noch keine anderen Sachen fertig, die eine Ausgabe besitzt außer die Klasse für HTML Tabellen ^^. Von daher dürfte es sogar hinkommen, dass die Klassen überall benutzt werden (wäre sinnvoll sogar). Dann kann ich das auch zentral ändern.
Ich trage es mir auf jeden Fall in meinen Bugtracker ein.
Dann wäre natürlich die freundlichere und besser Variante alles HTML zu erlauben und einfach bei der Anzeige durch die Entities zu ersetzen.
gepostet vor 17 Jahre, 3 Monate von azamaroth
Hiho!
strip_tags() war genau das was ich gesucht habe. Ich werde dann auf dem "Brett" darauf hinweisen, dass "<" und ">" und HTML Tags generell nicht benutzt werden sollen.
Dies soll sein, da Spieler ja keine Werbung/Spam posten sollen. Außerdem kann es auch sein dass Händler in meinem Spiel ingame ihre Ware anpreisen wollen, und das würde sie dann ein paar Goldkronen kosten um ihre Nachricht hervorzuheben

Auf diese Diskussion antworten