2010-09-23 62 views
0

我允许用户在他们的页面上嵌入视频,但以防万一我想过滤输出。为了呈现视频,我从数据库中检索嵌入语句,但是当它被过滤时,它以原始代码呈现。有没有一种视频友好的方式来过滤这样的事情,或者有没有人有任何建议以不同的方式来做到这一点?提前感谢您的任何建议。是否有可能过滤嵌入htmlspecialchars()的视频

while ($row = $query->fetch(PDO::FETCH_ASSOC)) { 
$video= htmlspecialchars($row['video'], ENT_NOQUOTES, 'UTF-8'); 
} 

echo "$video"; 

在数据库中,视频将看起来像这样的例子

<object width="464" height="368" id="669545" type="application/x-shockwave-flash" 
classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" alt="Aqua Teen Hunger Force - Hand Banana Funny 
Videos"><param name="movie" value="http://embed.break.com/NjY5NTQ1"></param><param 
name="allowScriptAccess" value="always"></param><embed src="http://embed.break.com/NjY5NTQ1" 
type="application/x-shockwave-flash" allowScriptAccess=always width="464" height="368"></embed></ 
object><br><font size=1><a href="http://www.break.com/usercontent/2009/2/Aqua-Teen-Hunger-Force-Hand- 
Banana-669545.html" target="_blank">Aqua Teen Hunger Force - Hand Banana</a> - Watch more <a href="http:// 
www.break.com" target="_blank">Funny Videos</a></font> 

回答

1

一般来说,你应该htmlspecialchars()你将其插入到HTML的地步荷兰国际集团用户输入。但在这种情况下,您已经拥有HTML,所以您无能为力。

你不能有用地过滤嵌入式插件。如果您允许用户指定一个任意的Flash文件或其他插件,那么您已经有效地为您提供了跨安全上下文的免费跨站点脚本访问,并且没有任何字符串限制可以解决这个问题。

如果您确实需要允许用户提交任意Flash或其他<object>/<embed>代码,则需要在单独的安全上下文中托管该不受信任的代码。通常情况下,您将主站点放在www.example.com上,并包含至stuff.example.com,它们会扫描不受信任的<object>代码。然后,当插件代码试图做一些敌对的事情时,至少它只会影响stuff.example.com而不会影响www.example.com上的任何真实web应用程序。

或者,您只能允许用户发布您信任的提供商的视频内容,例如。 youtube.com。然后,您只需让他们提交YouTube视频ID,并自行构建<object>代码,以指向该ID的网址。

+0

我喜欢第三种选择,但如果他们发布Flash或JavaScript内容到文本区域,无论如何,htmlspecialchars会阻止执行恶意代码,如果您过滤输出?是否有任何其他方式来过滤/防止跨站点脚本攻击? – Scarface 2010-09-23 16:20:51

+1

是的,如果他们在输入中输入'