Archiv verlassen und diese Seite im Standarddesign anzeigen : HTML Code bei Eingabe erlauben
JimDaniels 22-03-2007, 10:02 hallo,
wahrscheinlich werden mich einige steinigen wollen für diese idee, ist aber notwendig bei mir.
ich möchte ein formular, wo der user einen html code eingeben kann. dieser wird in der db gespeichert und an anderer stelle wieder ausgegeben (als htmlcode, also ohne htmlspecialchars etc.)
das wär ja nicht so schwer, wenn nur meine ganzen sicherheitsbedenken nicht wären. was für unsicherheitsfaktoren gibt es denn?? wenn ich php code eingebe, wird dieser ja ganz einfach ausgegeben und nicht ausgeführt. gibt es sonst noch dinge, auf die ich achten muss??
Ach ja, mysql_real_escape_string werde ich schon verwenden.
Original geschrieben von JimDaniels
das wär ja nicht so schwer, wenn nur meine ganzen sicherheitsbedenken nicht wären. was für unsicherheitsfaktoren gibt es denn??
Den hier:
ich möchte ein formular, wo der user einen html code eingeben kann.
Da du das nicht genauer spezifiert hast, darf der Nutzer also alles mögliche eingeben.
Ich könnte also bspw. per Iframe fremde Inhalte einbinden, oder auch Javascript, womit ich dann bspw. die Zieladresse eines Loginformulares auf deiner Seite auf ein Script auf meinem Server ändere, so dass ich die Daten deiner Nutzer ausspähen kann, etc. pp.
JimDaniels 22-03-2007, 10:40 Na schön, das sind doch schon mal 2 dinge, ich fange also einfach die tags <script> und <frame> oder <iframe> ab. sollte doch reichen, oder??
sonst noch etwas, mir macht das ganze mit php ein bißchen sorgen. werden die befehle wirklich nicht ausgeführt, wenn man sie einfach so eingibt, oder gibt es nicht doch eine möglichkeit, wie der user es fertig bringt, das die befehle als php interpretiert werden.
Benny-one 22-03-2007, 10:46 @Jim: Nimm strip_tags und erlaube einfach nur Tags wie z.B. b, strong, p, a, i, u, span, blockqoute, ul, li, div, img, table, tr, td, th, tbody
Das sollte ausreichen.
Original geschrieben von JimDaniels
Na schön, das sind doch schon mal 2 dinge, ich fange also einfach die tags <script> und <frame> oder <iframe> ab. sollte doch reichen, oder??
Nein.
sonst noch etwas, mir macht das ganze mit php ein bißchen sorgen. werden die befehle wirklich nicht ausgeführt, wenn man sie einfach so eingibt
Wenn du die Daten als reinen Text behandelst, werden sie nicht als PHP geparst.
JimDaniels 23-03-2007, 08:03 ich werde es einfach mal so probieren. Und die idee mit strip_tags hört sich gar nicht schlecht.
danke euch allen.
Blitzschlag 29-02-2008, 15:24 wow ist ja schon alt der Thread *g
Naja aber bevor ich einen neuen aufmache will ich es hier etwas weiterführen.
Ich möchte auch, dass meine User HTML benutzen können sollen und dürfen sie auch. Wegen der Benutzerfreundlichkeit benutze ich TinyMCE Editor.
Klar weiß ich, dass ich Javascript ausschalten kann und mir der User doch bösartiges unterschieben kann.
Deswegen mache ich das bis jetzt so: hoffe ihr seit damit zurfrieden.
Alles was vom TinyMCE Editor kommt:
Um SQL Injection zu vermeiden adslashes();
Um JavaScript uns sonstiges zu vermeiden striptags(); Bei striptags erlaube ich dann fast alle HTML tags ausser die frame geschichte und so weiter.
FRAGE: Wie sehr kann ich mich auf striptags verlassen ?
Es ist egal ob der user seine seite verunstalten kann mir ist nur wichtig, dass er mir kein javaScript unterschieben kann.
Was könnte man noch in Bezug auf Sicherheit und TinyMCE Editor tun für alle die denn nicht kennen ist so ein ähnlicher Editor wie FCKEditor
jahlives 29-02-2008, 15:35 Um SQL Injection zu vermeiden adslashes();
Besser gleich mysql_real_escape_string() verwenden.
Es ist egal ob der user seine seite verunstalten kann mir ist nur wichtig, dass er mir kein javaScript unterschieben kann.
Dann ist imho strip_tags() ein etwas zu grobes Geschütz. Dann wäre es für mich einfacher einfach einen regExp zu machen
preg_replace('/<script[^>]*>.*<\\/script>/isU','',$string);
Gruss
tobi
Blitzschlag 29-02-2008, 15:39 Besser gleich mysql_real_escape_string() verwenden.
Mache ich sonst auch immer nur leider verändert er das so scharf, dass ich dann nicht mehr stripslashes drauf anwenden kann. HTML soll ja im enddefekt durchkommen.
Man Reguläre Ausdrücke sind immer so schwer *g aber ich habe mich auch damit auseinander gesetzt.
Die möglichkeit habe ich auch schon benutzt dachte, (nachdem ich nicht schlafen konnte weil ich dachte alles wäre unsicher) dann aber och ich weiß ja was sie dürfen und was nicht also striptags() dann kann ich sicher sein, dass ich nichts vergessen habe.
jahlives 29-02-2008, 15:46 Mache ich sonst auch immer nur leider verändert er das so scharf, dass ich dann nicht mehr stripslashes drauf anwenden kann. HTML soll ja im enddefekt durchkommen.
Ähm strip_slashes() brauchst du auch nicht bei einem String der mit mysql_real_escape_string() bearbeitet wurde.
Und
Hinweis: Ist magic_quotes_gpc aktiviert, wenden Sie zuerst stripslashes() auf die Daten an. Das Bearbeiten bereits in irgend einer Form maskierter Daten durch mysql_real_escape_string führt ansonsten dazu, dass bereits Maskiertes doppelt maskiert wird.
die magic_quotes_gpc solltest du auf off haben oder sonst zuerst ein strip_slashes() drüber.
Man Reguläre Ausdrücke sind immer so schwer *g aber ich habe mich auch damit auseinander gesetzt.
Sind kompliziert aber brutal mächtig :D
Gruss
tobi
Blitzschlag 29-02-2008, 15:52 Der Hinweis ist cool. Vielleicht löst das Probleme mit denn ich umständliche Lösungen gefunden hatte *lach.
Danke aufjedenfall für deine Antworten.
Ohja sehr mächtig sogar benutze nur die leichten für mod_rewrite
Naja aber wie es aussieht kann ich mich auf jeden fall auf stripTags verlassen das ist ja meine größte sorge gewesen.
Gruss
Original geschrieben von Blitzschlag
Naja aber wie es aussieht kann ich mich auf jeden fall auf stripTags verlassen das ist ja meine größte sorge gewesen.
da bin ich anderer meinung, selbst mit regulären dingen wird es unmöglich sein alle fälle abzudecken, js einzuschleusen. zumindest, wenn du html zulässt.
z.b. js als bild verkleidet: <IMG SRC="javascript:alert('XSS');">
Blitzschlag 29-02-2008, 16:24 z.b. js als bild verkleidet: <IMG SRC="java script:alert('XSS');">
Habe ich mir auch schon überlegt. Aber meinste mann kann auch komplizierten gefährliches Javascript einschleusen ?
PHP-Desaster 29-02-2008, 19:04 Habe ich mir auch schon überlegt. Aber meinste mann kann auch komplizierten gefährliches Javascript einschleusen ?Wie oben erwähnt wurde, zum Beispiel die Zieladresse eines Formulars ändern. Dem Skript ist ziemlich Wumpe, von wo aus es ausgeführt wird. Das Schlimme ist, das es ausgeführt wird bzw. du es nicht raussortierst!!
Und es bleibt ja nicht nur bei JavaScript. Du kannst ja auch weitere CSS-Dateien über @import nachladen. Da kannst du sicherlich auch wieder Skripte einschleusen!
Blitzschlag 29-02-2008, 19:27 Ok ich habe es begriffen dan wäre es ja quasi unmöglich ausser einen bomben sicheren regulären Ausdruck.
MMM was denkst du was man dagen tun könnte ?
Inzwischen weiß ich ja was man so damit anstellen könnte aber eine wirklilche Problemlösung habe ich
nicht.
jahlives 29-02-2008, 19:43 @3DMax
Den Fall, dass JS via src oder href Attribut eingeschleust wird, könntest du mit weiteren RegExp ziemlich gut einschränken. Prüfung auf ungültige Zeichen und Dateiendungen mit RegExp wären doch relativ einfach umzusetzen.
Die Frage ist nurr ob sich der Aufwand lohnt unter dem Gesichtspunkt, dass es keine 100%-ige Sicherheit geben kann ;) Irgendjemand findet immer irgendwo die Lücke...
Gruss
tobi
Blitzschlag 29-02-2008, 20:30 <?php
/**
* Allow these tags
*/
$allowedTags = '<h1><b><i><a><ul><li><pre><hr><blockquote><img>';
/**
* Disallow these attributes/prefix within a tag
*/
$stripAttrib = 'javascript:|onclick|ondblclick|onmousedown|onmouseup|onmouseover|'.
'onmousemove|onmouseout|onkeypress|onkeydown|onkeyup';
/**
* @return string
* @param string
* @desc Strip forbidden tags and delegate tag-source check to removeEvilAttributes()
*/
function removeEvilTags($source)
{
global $allowedTags;
$source = strip_tags($source, $allowedTags);
return preg_replace('/<(.*?)>/ie',"'<'.removeEvilAttributes('\\1').'>'", $source);
}
/**
*
@return string
* @param string
* @desc Strip forbidden attributes from a tag
*/
function removeEvilAttributes($tagSource)
{
global $stripAttrib;
return stripslashes(preg_replace("/$stripAttrib/i", 'forbidden', $tagSource));
}
// Will output: <a href="forbiddenalert(1);" target="_blank" forbidden =" alert(1)">test</a>
echo removeEvilTags('<a href="javascript:alert(1);" target="_blank" onMouseOver = "alert(1)">test</a>');
?>
So habe das hier mal gefunden im php manuel sichert doch einiges ab oder net ? Habe es auch geteste. Ich hatte ja vorher nur strip_tags($meinText, $erlaubt); Da waren ja wie ihr schon festgestellt habt mehrere lücken.
joh, ist schon einigermaßen sicher, aber nicht ganz ;)
echo removeEvilTags("<img src=foo.png onerror=alert('XSS') />");
Blitzschlag 01-03-2008, 16:16 Man ihr macht mich fertig.
Also ich habe das erstmal als grundlage genommen denke, dass ich das noch erweitere. Vielleicht hat ja einer von euch eine idee.
Muss ja irgendwie möglichsein. Wenn ich mir myspace anschaue. Dort haben die Mitglieder auch sowas bzw. dürfen html und css benutzen mmmm.
Nein ich mache Myspace nicht nach ;)
warum benutzt du nicht einfach bb-code, da gibt es doch ganz gute parser.
myspace, da war doch was.
ach ja : Wurm schlängelt sich durch MySpace (http://www.heise.de/security/Wurm-schlaengelt-sich-durch-MySpace--/news/meldung/81924) :p
PHP-Desaster 01-03-2008, 17:16 Selbst wenn du alle Eventhandler und javascript in src- bzw. href-Attributen entfernst, könnte es durch einen Bug im Browser sein, das du ein JavaScript als Bild einbindest, indem du entsprechende Header setzt. Oder ein behaviour-Skript im IE (im Stile des png behaviour (http://webfx.eae.net/dhtml/pngbehavior/pngbehavior.html)).
die funktion removeEvilAttributes kann man übrigens dank stripslashes auch mit einem simplen backslash überlisten.
echo removeEvilTags('<a on\MouseOver = "alert(1)">test</a>');
Blitzschlag 02-03-2008, 14:52 Jetzt muss ich lachen andscheinend macht ihr euch mehr Gedanken darum, wie man "hack" als Sicher zu Programmieren.
Nicht böse gemeint aber vielleicht hat ja jemand eine Lösung HTML Code zu erlauben und sicher zu fahren.
PHP-Desaster 02-03-2008, 20:18 Jetzt muss ich lachen andscheinend macht ihr euch mehr Gedanken darum, wie man "hack" als Sicher zu Programmieren.
Nicht böse gemeint aber vielleicht hat ja jemand eine Lösung HTML Code zu erlauben und sicher zu fahren.Meinst du, jemand der unerlaubten Code bei dir einschleusen will verwendet sauberes HTML? Wenn der Browser on\Event interpretiert, hat deine Funktion an der Stelle ein Loch! :dontknow:
|
|