HTML Code nur teilweise "verbieten"
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
adresse
auslese
bild
code
dank
date
fetter text
file
form
funktion
image
kenntnis
message
schleife
senden
stelle
tag
text
verwenden
zeile
-
ho ;)
Ich habe von einem Bekannten PHP getag/code">codetes Gästebuch (eig. Shoutbox, aber ich will es als Gästebuch verwenden XD) bekommen.
Ich will dieses ein wenig verändern... (Meine PHP Kenntnisse streben allerdings gegen 0 :/ )
Unter anderem verbietet er die Eingabe von HTML Code per JavaScript, was zur folge hat, dass dieser "Schutz" von jedem umgangen werden kann.
Ich will aber nicht eines Tages meine Seite aufmachen, und ein Pornografische Bild vorfinden, ist ja klar...
Deswegen habe ich hier im Forum mal die Search Funktion ausprobiert :P und herausgefunden, dass man diesen Code anwenden kann, um HTML in einem String zu verbieten, und die Tags auszugeben, ohne sie umzuwandeln...
$good_shout = htmlspecialchars($shout);
Und das funktioniert ja auch ganz wunderbar :D
Der Post wird ausgelesen, und alles, was in Form von <Tags> gepostet wurde, wird genau so dar gestellt.
Das ganze hat nur einen Haken:
Es gibt auch Smileys. Diese werden vom User eingegeben (zB :D ) und per PHP in das Bildchen eines kleinen süßen Smileys umgewandelt.
Nun wäre der normale Post, den ein User schreibt ja Beispielsweise der:
Hallo :D
Vor meiner Veränderung (HTML erlaubt, nur via JS verboten)
Hallo (Grafik Smiley)
Und nach meiner Veränderung ist ja HTML verboten...
Hallo <img ...>
D.h., dass nicht mehr das Smiley in Bildform erscheint, sondern der HTML Tag, und das will ich in diesem Fall natürlich nicht.
Meine Frage lautet jetzt:
Gibt es eine Möglichkeit ausnahmen zu definieren? Also das ich sage: Nur die img Tags werden zugelassen, und auch nur dann, wenn es sich genau um meiner Smiley Bilder handelt?!
Ich bräuchte eine deppensichere Erklärung, da meine PHP Kenntnisse wie gesagt mehr als gering sind...
Thx im voraus
Sincer -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Stichwort Codes.
wie wärs mit einem [img=Adresse] oder [img]adresse[/img].... oder wenn du die Smilies eifnach als abkürzungen verfügbar machst...
Funktionen: preg_*
Referenz: php.net -
Hmm,
bin mir deines Codes noch nicht ganz bewußt und hab dementsprechend ein paar Fragen
Als dein Bekannter dir den Code gegeben hat, konnte man da zum Bsp ; - ) eingeben (zusammen geschrieben) und es wurde dann nach dem senden zu einem Smiley oder mußte man die Images-Html-Tag eingeben?
Wenn der Smiley per Script ersetzt wurde gegen die Html-Image-Tags, dann ist das durchaus auch wieder möglich.
In deinem Code müsste da wahrscheinlich eine ähnliche Zeile wie diese stehen:
$message = str_replace(";-)", "<img src='/images/test.jpg'>", $message);
An dieser Stelle müsstest du einfach auch den Suchstring "entquoten".
Also entweder so:
$message = str_replace(htmlspecialchars(";-)"), "<img src='/images/test.jpg'>", $message); // oder so: $message = str_replace("\;-\)", "<img src='/images/test.jpg'>", $message);
Grüßle -
Im Grunde ist das ganze ein so genannter BBCode, der per PHP in HTML Tags gewandelt wird. So wird zum Beispiel aus:
[b]Fetter Text[/b] = <b>Fetter Text</b>
Und der Besucher bekommt am Ende das zu sehen: Fetter Text
Einfach mal über Onkel Google nach BBCode Tutorials suchen und dort wird alles genaustens erklärt. -
Hier ein Beispiel wie du es ersetzen kannst:
function parseBBCode2HTML( $bb ) { $bb = preg_replace('/\n/', "<br/>", $bb); $bb = preg_replace('/\[b\](.*?)\[\/b\]/', '<b>$1</b>', $bb); $bb = preg_replace('/\[i\](.*?)\[\/i\]/', '<i>$1</i>', $bb); $bb = preg_replace('/\[u\](.*?)\[\/u\]/', '<u>$1</u>', $bb); $bb = preg_replace('/\[color=([[:alnum:]]{6}?).*\](.*?)\[\/color\]/', '<font color="#$1">$2</font>', $bb); //$bb = preg_replace('/\[url=([^ ]+).*\](.*)\[\/url\]/', '<a href="$1">$2</a>', $bb); $bb = preg_replace('/\[quote\](.*?)\[\/quote\]/', '<div class="zitat">$1</div>', $bb); $bb = $bb = preg_replace('/<br\/>/', "<br/>\n", $bb); return $bb; }
Damit dir deine Benutzer die Formatierung nicht zerstören können solltest du nicht alle [_b] zu <b> und alle [_/b] zu </b> ersetzten, sonder nur wenn zuerst [_b] dann irgendwas und dann [_/b] kommt.
Grüße,
Prog -
ho ;)
Erst einmal danke für eure vielen und brauchbaren Antworten :)
@scout:
Als dein Bekannter dir den Code gegeben hat, konnte man da zum Bsp ; - ) eingeben (zusammen geschrieben) und es wurde dann nach dem senden zu einem Smiley oder mußte man die Images-Html-Tag eingeben?
Ersteres - Button für Smiley drücken - fertig :D
Wenn der Smiley per Script ersetzt wurde gegen die Html-Image-Tags, dann ist das durchaus auch wieder möglich.
In deinem Code müsste da wahrscheinlich eine ähnliche Zeile wie diese stehen:
$message = str_replace("", "<img src='/images/test.jpg'>", $message);
Genau:
$stext = str_replace(":)", "<img src=./smilies/01.gif border=0 />", $stext);
$message = str_replace("\;-\)", "<img src='/images/test.jpg'>", $message);
Ok, das wäre dann wohl das, wonach ich ursprünglich gesucht habe... ich mache den HTML Code wieder zu Bildern...
Also danke ;)
Allerdings schieße ich mir damit ja selber ins Knie, wie mir gerade auffällt...
Warum sollte ich vorher den Smiley in HTML umwandeln lassen (Das ganze wird mit dem Übrigen Text (noch) innerhalb einer .txt File gespeichert), HTML verbieten, und es dann wieder nur für bestimmte Tags zu gestatten... da wäre es doch viel einfacher, wenn ich das Smiley einfach 1:1 in die .txt File übernehme, und ihn erst beim auslesen in einen HTML Tag (Bild) verwandle...
D.h. ich könnte den Code, den prog gepostet hat, ja auch für das Einfügen der Smiley-Bilder verwenden...
Aber wie genau mache ich das jetzt?
Mein Gedanke (Ich kann PHP wie gesagt eher nicht ^^):
Der Code wird wie gesagt aus einer .txt File ausgelesen.
Innerhalb einer Schleife...
$good_shout = htmlspecialchars($shout); // Wobei $shout das ist, was der User schreibt! $output_buffer .= "<strong>" . $shoutname . "</strong><br /><small>$date</small>\n<br />" . $good_shout . "<br /><hr />";
Also Name des Posters, das Datum, und dann die Nachricht.
(In dem Fall habe ich bereits jeden HTML Tag in seiner Ursprünglichen Form ausgeben lassen, ...
Wenn jem. HTML verwendet, steht dann nur der HTML Tag da und nicht das, was der Tag sonst machen würde, was ich ja auch so will...)
Wenn ich jetzt die Smileys aus der Text Datei auslesen lasse, und diese in Bilder verwandeln will, muss ich das (nehme ich an) so machen:
$good_shout = str_replace(":)", "<img src=./smilies/01.gif border=0 />", $good_shout); $good_shout = str_replace(":(", "<img src=./smilies/02.gif border=0 />", $good_shout); $good_shout = str_replace(";)", "<img src=./smilies/03.gif border=0 />", $good_shout); // usw...
Das baue ich zwischen "$good_shout = htmlspecialchars($shout);" und "$output_buffer .= ..." ein.
Und wenn ich jetzt noch BBCode zur Verfügung stellen will, kann ich ja den Code von prog verwenden. (Thx an dieser Stelle)
Baue ich diesen genauso ein?
Also nach dem ganzen $good_shout Smiley ersatz, dann einfach noch...
$good_shout= preg_replace('/\[b\](.*?)\[\/b\]/', '<b>$1</b>', $good_shout); $good_shout= preg_replace('/\[i\](.*?)\[\/i\]/', '<i>$1</i>', $good_shout); $good_shout= preg_replace('/\[u\](.*?)\[\/u\]/', '<u>$1</u>', $good_shout); // usw...
Stimmt das so, oder habe ich was falsch verstanden?
Also zusammengesetzt würde das dann so aussehen:
// Innerhalb der Schleife, die Zeile für Zeile aus der .txt Datei ausliest: $good_shout = htmlspecialchars($shout); $good_shout = str_replace(":)", "<img src=./smilies/01.gif border=0 />", $good_shout); $good_shout = str_replace(":(", "<img src=./smilies/02.gif border=0 />", $good_shout); $good_shout = str_replace(";)", "<img src=./smilies/03.gif border=0 />", $good_shout); $good_shout= preg_replace('/\[b\](.*?)\[\/b\]/', '<b>$1</b>', $good_shout); $good_shout= preg_replace('/\[i\](.*?)\[\/i\]/', '<i>$1</i>', $good_shout); $good_shout= preg_replace('/\[u\](.*?)\[\/u\]/', '<u>$1</u>', $good_shout); $output_buffer .= "<strong>" . $shoutname . "</strong><br /><small>$date</small>\n<br />" . $good_shout . "<br /><hr />";
thx
Sincer
//EDIT: So, bin endlich dazu gekommen, es zu testen :D
Funktioniert, so weit ich das beurteilen kann ;)
Thx!
Beitrag zuletzt geändert: 16.1.2009 20:46:03 von sincer -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage