Frage

Ich möchte, damit die Benutzer <embed> und <object> HTML-Fragmente (Video-Player) über ein HTML-Formular einzufügen. Der serverseitige Code ist PHP. Wie kann ich gegen schädliche klebte Code schützen, JavaScript, etc? Ich kann den eingefügten Code analysieren, aber ich bin nicht sicher, ob ich für alle Variationen erklären könnte. Gibt es einen besseren Weg?

War es hilfreich?

Lösung

Ich bin nicht wirklich sicher, was EMBED Parameter und OBJECT zu nehmen, wie ich habe nie wirklich mit Putting Medien auf einer Seite behandelt (was eigentlich ganz schockierend ist, um darüber nachzudenken), aber ich würde einen BB-Code Ansatz, um es nehmen und etwas tun, wie [embed url="http://www.whatever.com/myvideo.whatever" ...] und dann können Sie die URL und alles andere analysieren, stellen Sie sicher, sie sind echt und Ihre eigenen <EMBED> Tag machen.

Bearbeiten In Ordnung, so etwas wie dies sollte in Ordnung sein:

$youtube = '<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"></param> </param><embed src="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object>';

$blip = '<embed src="http://blip.tv/play/AZ_iEoaIfA" type="application/x-shockwave-flash" width="640" height="510" allowscriptaccess="always" allowfullscreen="true"></embed>';

preg_match_all("/([A-Za-z]*)\=\"(.+?)\"/", $youtube, $matches1);
preg_match_all("/([A-Za-z]*)\=\"(.+?)\"/", $blip, $matches2);
print '<pre>' . print_r($matches1, true). '</pre>';
print '<pre>' . print_r($matches2, true). '</pre>';

Dies wird ausgegeben:

Array
(
[0] => Array
    (
        [0] => width="425"
        [1] => height="344"
        [2] => name="movie"
        [3] => value="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"
        [4] => src="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"
        [5] => type="application/x-shockwave-flash"
        [6] => allowfullscreen="true"
        [7] => width="425"
        [8] => height="344"
    )

[1] => Array
    (
        [0] => width
        [1] => height
        [2] => name
        [3] => value
        [4] => src
        [5] => type
        [6] => allowfullscreen
        [7] => width
        [8] => height
    )

[2] => Array
    (
        [0] => 425
        [1] => 344
        [2] => movie
        [3] => http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1
        [4] => http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1
        [5] => application/x-shockwave-flash
        [6] => true
        [7] => 425
        [8] => 344
    )
)

Array
(
[0] => Array
    (
        [0] => src="http://blip.tv/play/AZ_iEoaIfA"
        [1] => type="application/x-shockwave-flash"
        [2] => width="640"
        [3] => height="510"
        [4] => allowscriptaccess="always"
        [5] => allowfullscreen="true"
    )

[1] => Array
    (
        [0] => src
        [1] => type
        [2] => width
        [3] => height
        [4] => allowscriptaccess
        [5] => allowfullscreen
    )

[2] => Array
    (
        [0] => http://blip.tv/play/AZ_iEoaIfA
        [1] => application/x-shockwave-flash
        [2] => 640
        [3] => 510
        [4] => always
        [5] => true
    )
)

Von da an ziemlich geradlinig ist. Für Dinge wie Breite / Höhe können Sie sie mit is_numeric und mit dem Rest können Sie die Werte durchlaufen htmlentities und Ihren eigenen <embed> Tag aus den Informationen konstruieren. Ich bin mir ziemlich sicher, dass dies sicher sein würde. Sie können sogar die vollwertige <object> ein wie YouTube machen mit Links von blip.tv (was ich Arbeiten an mehr Orten übernehmen), da Sie alle erforderlichen Daten haben.

Ich bin sicher, dass Sie einige Macken mit Links von anderen Video-Sharing-Websites sehen können, aber das wird hoffentlich bekommen Sie begonnen haben. Viel Glück.

Andere Tipps

Ihre Chancen bösartigen Code zuverlässig zu detektieren durch eingegebenen HTML Scannen sind etwa gleich Null. Es gibt so viele Möglichkeiten, Skript (einschließlich browserspezifischen ungültige HTML) zu injizieren, werden Sie nicht in der Lage sein, sie alle heraus zu holen. Wenn große Webmail-Anbieter noch nach Jahren der Suche nach neuen Exploits gibt es keine Chance, dass Sie der Lage sein, es zu tun.

würdiger ist besser als eine schwarze Liste. So könnte man stattdessen die Eingabe erfordert XHTML zu sein, und analysiert es einen Standard-XML-Parser verwenden. Dann gehen Sie durch den DOM und prüfen, ob jedes der Elemente und Attribut ist bekannt-gut, und wenn alles in Ordnung, serialise zurück zu XHTML, die aus einem intakten DOM kommen, soll nicht fehlerhaft sein. Ein richtiger XML-Parser mit Unicode-Unterstützung sollte auch böse ‚überlang UTF-8-Sequenzen‘ herauszufiltern (ein Loch Sicherheit zu beeinträchtigen IE6 und ältere Operas) kostenlos.

Allerdings ... wenn Sie erlauben einbetten / Objekte aus einer beliebigen Domäne, haben Sie bereits vollständige Skript Zugriff auf Ihre Seite von einer externen Domains erlauben, so HTML-Injektion die wenigsten Sorgen ist. Plug-In wie Flash ist wahrscheinlich in der Lage sein, JavaScript auszuführen, ohne jede Art von Betrug notwendig ist.

So Sie die Quelle von Objekten zu vorbestimmten bekannt-guten Domänen zu begrenzen werden sollen. Und wenn Sie schon das zu tun, ist es wahrscheinlich einfacher, nur der Benutzer zu erlauben, einen Video-Anbieter und Clip-ID zu wählen, und dann konvertieren, dass in den richtigen, bekannt-guten Einbettungscode für diesen Anbieter. Wenn Sie zum Beispiel eine bbcode artige Markup verwenden, sind die traditionelle Art und Weise Benutzer zu lassen, ein YouTube-Clip etwas wäre [youtube] Dtzs7DSh [/ youtube].

Hier ist ein Beispiel von eingefügtem Code von blip.tv:

<embed src="http://blip.tv/play/AZ_iEoaIfA" type="application/x-shockwave-flash"    
  width="640" height="510" allowscriptaccess="always" allowfullscreen="true"></embed>

Hier ist ein Beispiel dafür, was man von YouTube bekommen könnte:

<object width="425" height="344">
  <param name="movie" value="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"></param>
  <param name="allowFullScreen" value="true"></param>
    <embed src="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"
      type="application/x-shockwave-flash" allowfullscreen="true"
      width="425" height="344"></embed>
</object>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top