如何安全地接受粘贴<;嵌入>;PHP代码

如何安全地接受粘贴<;嵌入>;PHP代码,php,validation,embed,Php,Validation,Embed,我想允许用户通过HTML表单粘贴和HTML片段(视频播放器)。服务器端代码是PHP。如何防止恶意粘贴代码、JavaScript等?我可以解析粘贴的代码,但我不确定是否可以解释所有的变化。有更好的方法吗?我不太确定嵌入和对象的参数是什么,因为我从来没有真正处理过将媒体放在页面上的问题(这实际上有点令人震惊),但我会采用BB代码的方法,并做一些类似[EMBED url=”的事情http://www.whatever.com/myvideo.whatever" ...]然后您可以解析出URL和其他任何

我想允许用户通过HTML表单粘贴
HTML片段(视频播放器)。服务器端代码是PHP。如何防止恶意粘贴代码、JavaScript等?我可以解析粘贴的代码,但我不确定是否可以解释所有的变化。有更好的方法吗?

我不太确定
嵌入
对象
的参数是什么,因为我从来没有真正处理过将媒体放在页面上的问题(这实际上有点令人震惊),但我会采用BB代码的方法,并做一些类似
[EMBED url=”的事情http://www.whatever.com/myvideo.whatever" ...]
然后您可以解析出URL和其他任何内容,确保它们是合法的,并创建自己的
标记

编辑:好的,像这样的东西应该可以:

$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>';
从那时起,一切都很简单。对于宽度/高度之类的内容,您可以使用其他内容来验证它们,您可以运行这些值,并根据信息构建自己的
标记。我很肯定这是安全的。你甚至可以通过blip.tv上的链接制作一个像YouTube(我假设它在更多地方都能工作)这样的功能完备的
视频,因为你将拥有所有需要的数据


我相信你可能会在其他视频分享网站的链接中看到一些怪癖,但这将有望让你开始。祝你好运。

以下是blip.tv中粘贴的代码示例:


以下是您可能从YouTube获得的示例:


通过扫描输入的HTML,您可靠地检测恶意代码的几率约为零。有太多可能的方法来注入脚本(包括特定于浏览器的格式错误的HTML),您无法将它们全部挑选出来。如果大型网络邮件提供商多年来仍在寻找新的漏洞,那么你就不可能做到这一点

白名单比黑名单好。因此,您可以要求输入为XHTML,并使用标准XML解析器对其进行解析。然后遍历DOM并检查每个元素和属性是否已知良好,如果一切正常,则序列化回XHTML,它来自已知良好的DOM,不应出现格式错误。一个适当的支持Unicode的XML解析器还应该免费过滤掉讨厌的“过长的UTF-8序列”(一个影响IE6和旧版本歌剧的安全漏洞)

然而。。。如果您允许任何域中的嵌入/对象,那么您已经允许从外部域对页面进行完整的脚本访问,因此HTML注入是您最不担心的。Flash之类的插件很可能能够执行JavaScript,而无需任何诡计


因此,您应该将对象的来源限制为预先确定的已知良好域。如果你已经这样做了,那么让用户选择一个视频提供商和剪辑ID,然后将其转换为该提供商的正确的、已知的、良好的嵌入代码可能会更容易。例如,如果您使用的是类似bbcode的标记,则允许用户包含YouTube剪辑的传统方式是[YouTube]Dtzs7DSh[/YouTube]。

您可以查看任何YouTube或blip.tv上的代码,查看其中的内容。它不仅仅是一个URL。起初我不喜欢这个解决方案,因为它只是模式匹配,而不是实际解析。但事实证明,Flash实际上只需要很少的属性。所以我用这个作为最终解决方案的基础。谢谢你,保罗。
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
    )
)
<embed src="http://blip.tv/play/AZ_iEoaIfA" type="application/x-shockwave-flash"    
  width="640" height="510" allowscriptaccess="always" allowfullscreen="true"></embed>
<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>