php - 当您允许人们发布 RAW 嵌入代码时,如何保护自己免受 XSS 攻击?

标签 php regex

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 还允许您使用标准 API 修改 HTML 文档——如果您想在视频旁边添加一些消息或任何其他类似的东西,这可能会有所帮助。

关于php - 当您允许人们发布 RAW 嵌入代码时,如何保护自己免受 XSS 攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2481720/

相关文章:

php - Laravel中如何将变量从一个 Controller 传递到另一个 Controller

javascript - NodeJS 中的正则表达式 : Only split() if next character is not a dot

javascript - 正则表达式,匹配以@开头的文本,但不带@

regex - 如何在 Notepad++ 中选择每第n行并将每一个连续的行交换到下一个第m行

java - 无法在 android 中的服务器 mysqli/Php 上发布数据

php - Laravel 5.2 使用 url get 参数创建查询以选择字段、匹配字符串和排序

php - 在 Php 中获取南非标准时间

python - 捕获正则表达式中的可选部分

regex - 带有未注释的 "console.log"字符串的 Grep 文件

php - https 站点在本地打不开