【问题标题】:Is it possible to filter video embed with htmlspecialchars()是否可以过滤嵌入 htmlspecialchars() 的视频
【发布时间】:2011-04-16 08:49:24
【问题描述】:

我允许用户在他们的页面上嵌入视频,但以防我想过滤输出。为了呈现视频,我从数据库中检索了 embed 语句,但是当它被过滤时,它以原始代码的形式呈现。有没有一种视频友好的方式来过滤这样的东西,或者有人对不同的方式有什么建议吗?提前感谢您的任何建议。

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>

【问题讨论】:

    标签: php html video embed


    【解决方案1】:

    一般来说,在将用户输入插入 HTML 时,您应该是 htmlspecialchars()ing 用户输入。但在这种情况下,您已经拥有 HTML,因此您无能为力。

    您无法有效地过滤嵌入式插件。如果您允许用户指定任意 Flash 文件或其他插件,则您已经有效地为他们提供了对您的安全上下文的免费跨站点脚本访问权限,并且再多的字符串清理也无法解决此问题。

    如果您确实需要允许用户提交任意 Flash 或其他 &lt;object&gt;/&lt;embed&gt; 代码,则需要在单独的安全上下文中托管该不受信任的代码。通常,您将主站点放在www.example.com 上,并在stuff.example.com 中包含一个&lt;iframe&gt;,它会吐出不受信任的&lt;object&gt; 代码。然后当插件代码试图做一些敌对的事情时,至少它只能影响stuff.example.com,而不是www.example.com上的任何真正的webapp。

    或者,您可以只允许用户发布来自您信任的提供商的视频内容,例如。 youtube.com。然后,您只需让他们提交一个 YouTube 视频 ID,并自己构建 &lt;object&gt; 代码以指向该 ID 的 URL。

    【讨论】:

    • 我喜欢第三种选择,但是如果他们将 flash 或 javascript 内容发布到文本区域怎么办,如果您过滤输出,htmlspecialchars 会阻止执行该恶意代码吗?还有其他过滤/防止跨站脚本攻击的方法吗?
    • 是的,如果他们在输入中输入&lt;script&gt;,而您在退出页面时将该值htmlspecialchars(),他们将看到文字文本&lt;script&gt;,而不是实际的脚本标签。还有其他方法,例如在输入数据进入数据库之前对输入数据进行 HTML 转义/过滤,可悲的是,很多人这样做......这些方法的技术术语是“坏掉的”。只需确保在创建 HTML 输出时,每一段纯文本,无论是来自用户输入、数据库还是其他地方,在插入 HTML 之前都是 htmlspecialchars()ed。
    • (你可能想要创建一个像 h() 这样的短名称的辅助函数来执行 echo htmlspecialchars 这样你就不必输入很多 &lt;?php echo htmlspecialchars($value); ?&gt;...)
    • 这是个好主意,哈哈,我确实经常使用 htmlspecialchars,感谢您的洞察力,感谢 bobince
    猜你喜欢
    • 2013-10-11
    • 2012-03-20
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2019-12-08
    • 1970-01-01
    相关资源
    最近更新 更多