Php 当您允许人们发布原始嵌入代码时,如何保护自己免受XSS攻击?
Tumblr和其他博客网站允许人们发布来自youtube和所有视频网络的嵌入视频代码 但是他们如何只过滤flash对象代码并删除任何其他html或脚本呢?即使他们有一个自动代码,告诉你这不是一个有效的视频代码 这是使用正则表达式完成的吗?有一个PHP类可以做到这一点吗Php 当您允许人们发布原始嵌入代码时,如何保护自己免受XSS攻击?,php,regex,Php,Regex,Tumblr和其他博客网站允许人们发布来自youtube和所有视频网络的嵌入视频代码 但是他们如何只过滤flash对象代码并删除任何其他html或脚本呢?即使他们有一个自动代码,告诉你这不是一个有效的视频代码 这是使用正则表达式完成的吗?有一个PHP类可以做到这一点吗 谢谢先看一下htmlpurifier。 一般来说,使用正则表达式不是处理HTML的好方法:HTML对于正则表达式来说不够正则:标准中允许的变体太多。。。浏览器甚至接受无效的HTML 在PHP中,由于您的问题被标记为PHP,因此过
谢谢先看一下htmlpurifier。
一般来说,使用正则表达式不是处理HTML的好方法:HTML对于正则表达式来说不够正则:标准中允许的变体太多。。。浏览器甚至接受无效的HTML
在PHP中,由于您的问题被标记为
PHP
,因此过滤用户输入的一个很好的解决方案就是该工具
以下是一些有趣的事情:
- 它允许您指定允许哪些特定标记
- 对于每个标记,您可以定义允许哪些特定属性
如果你只指定一个标签和属性列表,这些标签和属性不会造成伤害,那么只保留这些标签和属性,注射的风险就会大大降低
引用HTMLPurifier的主页: HTML净化器是符合标准的 用PHP编写的HTML过滤器库。
HTML净化器将不仅删除 所有恶意代码(更好地称为 XSS)进行彻底审计, 安全但允许的白名单,它 还将确保您的文档 符合标准,仅此而已 可通过全面的 了解W3C规范 是的,另一个很棒的事情是,作为输出得到的代码是有效的
当然,这只允许您清理/过滤/净化HTML输入;它将不允许您验证用户使用的URL是否同时为:
- 正确的;i、 e.指向真实内容
- 您的网站定义的“确定”;i、 例如,不要裸体
关于第二点,我们无能为力:最好的解决方案是:
- 让版主在内容上线前接受/拒绝这些内容
- 为网站用户提供一种方式,将某些内容标记为不合适,以便版主采取行动
不过,关于第一点,还是有希望的:一些承载内容的服务具有您可能想要/能够使用的API 例如,Youtube提供了一个API——请参见 在您的情况下,该部分看起来很有希望:如果您向如下所示的URL发送HTTP请求:
http://gdata.youtube.com/feeds/api/videos/videoID
(当然,将“videoID”替换为视频的ID)
如果视频有效,您将获得一些ATOM提要;如果不是,则为“无效id”
这可能会帮助您验证至少一些内容的URL——即使您必须为您的用户喜欢的每个可能的内容托管服务开发一些特定的代码
现在,要从HTML字符串中提取视频的标识符。。。如果您正在考虑使用正则表达式,那么您就错了;-) 从HTML字符串中提取部分数据的最佳解决方案通常是:
- 使用DOM解析器加载HTML;在这里,它通常非常有用
- 使用DOM方法浏览文档;或者,根据您的情况:
- ,如果需要迭代具有特定标记名的所有元素;例如,迭代所有
或
标记可能非常好 - 或者,如果需要更复杂的内容,可以使用及其方法执行XPath查询
- ,如果需要迭代具有特定标记名的所有元素;例如,迭代所有
使用DOM还允许您使用标准API修改HTML文档——如果您想在视频旁边添加消息或其他类似内容,这可能会有所帮助。这永远都不会安全。浏览器有一些有趣的小功能,可以帮助人们显示页面内容,即使html很凌乱。有无数的机会让事情顺利通过:) 查看冰山一角 你需要做的是使用一个单一的输入只为一个链接和传统的输入宽度和高度,并过滤这些。然后自己生成对象标记
这可能是安全的。我已经为我工作的公司实现了一个算法。它很好用。但是,实施起来相当复杂 我一定会看看HTMLPurifier,看看它是否能以一种简单的方式为您工作。如果你坚持像我一样用传统的方式做,这是基本步骤: 一,。 第一个==>友好地使用
stripos()
二,。
您必须创建一个递归函数来识别小部件的开始和停止标记,该函数包括
或
(自关闭)或
的所有组合。。。或…
三,。
在此之后,您必须解析出所有属性和参数
四,。
现在,所有的
标记都应该有
标记作为子元素。您必须解析所有这些,以获得最终生成新的嵌入或对象标记所需的所有数据。特别是与数据源、高度相关的参数和属性非常重要
五,。
现在,您不知道这些属性是用单引号还是双引号括起来的,因此您的代码必须以这种方式宽松。此外,您不知道代码是否有效或格式正确。所以,它应该是b