Question

Je souhaite autoriser les utilisateurs à coller < embed > et < objet > via un formulaire HTML. Le code côté serveur est PHP. Comment puis-je me protéger contre le code collé malveillant, le JavaScript, etc.? Je pourrais analyser le code collé, mais je ne suis pas sûr de pouvoir rendre compte de toutes les variations. Y a-t-il un meilleur moyen?

Était-ce utile?

La solution

Je ne suis pas vraiment sûr des paramètres EMBED et OBJECT , car je ne me suis jamais vraiment occupé de mettre des médias sur une page (ce qui choque mais je voudrais adopter une approche de code BB et faire quelque chose comme [embed url = & http; //www.wwhat.com/myvideo.wther" ...] et vous pourrez ensuite analyser l'URL et tout le reste, assurez-vous qu'ils sont légitimes et créez votre propre balise < EMBED > .

modifier: Très bien, une solution de ce type devrait bien se passer:

$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>';

Ceci produira:

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
    )
)

A partir de là, c'est assez simple. Pour des éléments tels que largeur / hauteur, vous pouvez les vérifier avec is_numeric et avec Pour rester, vous pouvez exécuter les valeurs via htmlentities et créer votre propre . < incorporer > à partir des informations. Je suis à peu près certain que cela serait en sécurité. Vous pouvez même créer un < objet > à part entière comme YouTube (qui, je suppose, fonctionne à plus d'endroits) avec des liens provenant de blip.tv, car vous auriez toutes les données requises.

Je suis sûr que vous pouvez voir quelques bizarreries avec des liens d'autres sites Web de partage de vidéos, mais nous espérons que cela vous aidera à démarrer. Bonne chance.

Autres conseils

Vos chances de détecter le code malveillant de manière fiable en analysant le code HTML entré sont quasi nulles. Il y a tellement de façons d'injecter un script (y compris du HTML malformé spécifique au navigateur) que vous ne pourrez pas tous les sélectionner. Si les grands fournisseurs de messagerie Web trouvent encore, après des années, de nouveaux exploits, il n’ya aucune chance que vous puissiez le faire.

La liste blanche est meilleure que la liste noire. Vous pouvez donc exiger que l'entrée soit au format XHTML et l'analyser à l'aide d'un analyseur XML standard. Parcourez ensuite le DOM et vérifiez que chacun des éléments et attributs est connu comme bon, et si tout va bien, sérialisez en XHTML, ce qui, provenant d'un DOM connu comme bon, ne devrait pas être mal formé. Un analyseur XML approprié prenant en charge Unicode devrait également filtrer gratuitement les "séquences UTF-8" superflues (une faille de sécurité affectant IE6 et les anciens opéras).

Cependant ... si vous autorisez incorporer / des objets à partir de n'importe quel domaine, vous autorisez déjà un accès complet à votre page par un script à partir d'un domaine externe. L'injection HTML est donc le moindre de vos soucis. Les plug-ins tels que Flash sont susceptibles d’exécuter du JavaScript sans qu’aucune astuce ne soit nécessaire.

Vous devriez donc limiter la source des objets à des domaines prédéterminés de qualité connue. Et si vous le faites déjà, il est probablement plus simple de permettre à l'utilisateur de choisir un fournisseur de vidéo et un ID de clip, puis de le convertir en code d'intégration approprié pour ce fournisseur. Par exemple, si vous utilisez un balisage de type bbcode, la méthode traditionnelle permettant aux utilisateurs d'inclure un clip YouTube serait quelque chose [youtube] Dtzs7DSh [/ youtube].

Voici un exemple de code collé à partir de blip.tv:

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

Voici un exemple de ce que vous pourriez obtenir de YouTube:

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top