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