Tumblr 和其他博客网站允许人们发布来自 youtube 和所有视频网络的视频的嵌入代码。
但是他们如何只过滤 flash 对象代码并删除任何其他 html 或脚本?甚至他们都有一个自动代码来通知您这不是有效的视频代码。
这是使用 REGEX 表达式完成的吗?是否有一个 PHP 类可以做到这一点?
谢谢
最佳答案
一般来说,使用正则表达式不是处理 HTML 的好方法:对于正则表达式,HTML 不够规则:标准中允许的变体太多...浏览器甚至接受HTML 无效!
在 PHP 中,因为您的问题被标记为 php
,过滤用户输入的一个很好的解决方案是 HTMLPurifier工具。
一些有趣的事情是:
- 它允许您指定允许使用哪些特定标签
- 对于每个标签,您可以定义允许哪些特定属性
基本上,这个想法是只保留您指定的(白名单),而不是尝试使用黑名单(永远不会很完整)来删除不良内容.
如果您只指定一个不会造成伤害的标签和属性列表,那么只会保留那些标签和属性——注入(inject)的风险会大大降低。
引用 HTMLPurifier 的主页:
HTML Purifier is a standards-compliant HTML filter library written in PHP.
HTML Purifier will not only remove all malicious code (better known as XSS) with a thoroughly audited, secure yet permissive whitelist, it will also make sure your documents are standards compliant, something only achievable with a comprehensive knowledge of W3C's specifications.
是的,另一件很棒的事情是您作为输出获得的代码是有效的。
当然,这只会让您清理/过滤/净化 HTML 输入;它不允许您验证用户使用的 URL 是否为:
- 正确;即指向一个真实的内容
- 您网站定义的“确定”;即例如没有裸体,...
关于第二点,对此我们无能为力:最好的解决方案是:
- 在内容上线之前让版主接受/拒绝这些内容
- 为网站用户提供一种将某些内容标记为不当内容的方式,以便版主采取措施。
基本上,要检查视频的内容本身,没有太多选择,只能让一个人说“ok”或“not ok”。
不过,关于第一点,还是有希望的:一些托管内容的服务具有您可能想要/能够使用的 API。
例如,Youtube 提供了一个 API -- 请参阅 Developer's Guide: PHP .
在您的例子中,Retrieving a specific video entry部分看起来很有前途:如果您向如下所示的 URL 发送 HTTP 请求:
http://gdata.youtube.com/feeds/api/videos/videoID
(当然是用视频 ID 替换“videoID”)
如果视频有效,您将获得一些 ATOM 提要;如果不是,则为“无效 ID”
这可能会帮助您至少验证一些内容的 URL——即使您必须为您的用户喜欢的每个可能的内容托管服务开发一些特定的代码...
现在,要从您的 HTML 字符串中提取视频的标识符...如果您正在考虑使用正则表达式,那您就错了;-)
从 HTML 字符串中提取部分数据的最佳解决方案通常是:
- 使用 DOM 解析器加载 HTML ;
DOMDocument::loadHTML
通常很有帮助,在这里 - 使用 DOM 方法浏览文档;要么,取决于你的情况:
-
DOMDocument::getElementsByTagName
,如果您需要遍历所有具有特定标签名称的元素;迭代所有<object>
可能很棒或<embed>
标签,例如 - 或者,如果您需要更复杂的东西,您可以使用 the
DOMXPath
class 进行 XPath 查询。及其DOMXPath::query
方法。
-
并且使用 DOM 还允许您使用标准 API 修改 HTML 文档——如果您想在视频旁边添加一些消息或任何其他类似的东西,这可能会有所帮助。
关于php - 当您允许人们发布 RAW 嵌入代码时,如何保护自己免受 XSS 攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2481720/