我允许用户在他们的页面上嵌入视频,但以防万一我想过滤输出。为了呈现视频,我从数据库中检索了嵌入语句,但是当它被过滤时,它以原始代码呈现。是否有一种视频友好的方式来过滤这样的东西,或者有人以不同的方式做任何建议吗?提前感谢任何建议。
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>
答案 0 :(得分:1)
通常,在将其插入HTML时,您应该htmlspecialchars()
用户输入。但是在这种情况下你已经有了HTML,所以你无能为力。
您无法有效地过滤嵌入式插件。如果您允许用户指定任意Flash文件或其他插件,您已经有效地为他们提供了对您的安全上下文的免费跨站点脚本访问,并且没有多少字符串清理可以解决这个问题。
如果您确实需要允许用户提交任意Flash或其他<object>
/ <embed>
代码,则需要在单独的安全上下文中托管该不受信任的代码。通常,您将主网站放在www.example.com
上,并添加<iframe>
到stuff.example.com
,这会吐出不受信任的<object>
代码。然后,当插件代码尝试做一些敌对的事情时,至少它只会影响stuff.example.com
,而不会影响www.example.com
上的任何真实网络应用。
或者,您只能允许用户发布您信任的提供商的视频内容,例如。 youtube.com
。然后,您只需让他们提交YouTube视频ID,并自行构建<object>
代码,以指向该ID的网址。