助力软件开发企业降本增效 PHP / java源码系统,只需一次付费,代码终身使用! 广告
客户喜欢他们的YouTube视频。当他们在网站上看到一个简洁的嵌入式视频播放器,可以播放纪录片《 Fido and the Bones of Spring》中的最新片段时,这给他们一种温暖的模糊感。除了开玩笑之外,很多人都喜欢将YouTube视频或其他有效内容嵌入其页面的功能。 这是一个*坏*主意。嵌入任何不受信任的内容的那一刻,您肯定会被一种肮脏的方式所震撼,这种方式可以嵌入到从运行Flash电影到[Quicktime电影的](http://blog.spywareguide.com/2006/12/myspace_phish_attack_leads_use.html)事物中。`img`HTML Purifier默认允许的甚至标签也可能很危险。不要让任何内容告诉浏览器自动从另一个网站加载内容。 对我们来说幸运的是,将白名单保存可以节省一天的时间。当然,让用户包括任何旧的随机Flash文件可能很危险,但是如果它来自特定网站,则可能还可以。如果没有多少恳求可以说服楼上的人们,他们应该只是通过链接到他们的电影就可以解决问题,那么您可能会发现此技术非常有用。 ## Looking in 以下是允许用户嵌入YouTube视频的自定义代码。这不是偏favor:此技巧很容易适用于其他形式的可嵌入内容。 通常,YouTube之类的网站会向我们提供样板代码,您可以将其插入文档中。YouTube的代码如下: ~~~ <object width="425" height="350"> <param name="movie" value="http://www.youtube.com/v/AyPzM5WK8ys" /> <param name="wmode" value="transparent" /> <embed src="http://www.youtube.com/v/AyPzM5WK8ys" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350" /> </object> ~~~ 此代码有两点需要注意: 1. `<embed>`是W3C无法识别的,因此,如果要使用符合标准的代码,则必须摆脱它。 2. 该代码对于所有实例都完全相同,除了标识符AyPzM5WK8ys告诉我们要检索哪个电影文件。 第二点的意思是,如果我们拥有像`<span class="youtube-embed">AyPzM5WK8ys</span>`您的应用程序这样的代码,则可以从*不受伤害地*通过HTML Purifier的这个小片段中重建完整的对象。[给我看看代码!](http://repo.or.cz/w/htmlpurifier.git?a=blob;hb=HEAD;f=library/HTMLPurifier/Filter/YouTube.php) 以及相应的用法: ~~~ <?php $ config-> set('Filter.YouTube',true); ?> ~~~ 这两个代码段中有一些内容,所以让我们解释一下。 1. 这是一个Filter对象,它拦截进出净化器的HTML。您可以根据需要添加任意数量的过滤器对象。`preFilter()`在纯化之前处理代码,然后再`postFilter()`处理代码。因此,我们将使用`preFilter()`来替换object标签`span`,并将`postFilter()`其还原。 2. 第一个preg\_replace调用将替换用户可能已嵌入到良性span标签中的所有YouTube代码。使用Span是因为它是内联的,对象也是内联的。我们非常谨慎地对span标记内的内容进行严格限制,好像错误的代码进入那里可能会变得混乱。 3. 然后照常净化HTML。 4. 然后,另一个preg\_replace将span标签替换为完全成熟的对象。请注意,嵌入被删除,并且在其位置上将data属性添加到了对象。这使得标签符合标准!它还破坏了Internet Explorer,因此我们在旧的嵌入代码中添加了一些条件注释,以使其再次起作用。一切都令人费解,但是可以。 ## 警告 上面的代码可能有很多问题,具体取决于您的看待方式。 ### 无法更改宽度和高度 无法调整最终YouTube电影的宽度和高度。这是因为我很懒。如果您确实要让用户更改电影的大小,那么您需要做的就是将span标签(以及电影ID)打包为属性。但是,它变得复杂:恶意用户可以指定一个非常大的高度和宽度,并尝试使该用户的操作系统/浏览器崩溃。您需要通过限制正则表达式中允许的位数来限制它,或者使用回调来检查数字。 ### 信任媒体主持人的安全 通过将此代码发布到我们的网站上,我们相信YouTube拥有足够的精通技术的人员,不允许他们的用户向Flash文件中注入恶意代码。YouTube上的漏洞利用就是您网站上的漏洞利用。即使YouTube是由著名的Google经营,但这[并不](http://ha.ckers.org/blog/20061213/google-xss-vuln/)意味着它们是[无敌的。](http://ha.ckers.org/blog/20061208/xss-in-googles-orkut/)您正在对外部提供者进行一定程度的工作评估(就像您将用户输入委托给HTML Purifier一样),并且意识到这一点很重要。 ### 写得不好的改编损害了安全性 这应该不言而喻,但是如果您要针对Google Video等修改此代码,请确保您做*对了*。允许过多的字符是非常容易的`postFilter()`,突然间您将XSS引入HTML Purifier的XSS free输出中。HTML Purifier可能写得很好,但是它无法防止在完成后引入的漏洞。 ## 帮帮忙! 如果您为自己喜欢的视频目标(或类似的目标)编写过滤器,请将其发送出去,它可能会包含在核心中!