从请求中接受一组预定义的无害 HTML 标记有多安全?

2024-02-23

作为一名 Web 开发人员,我学到的第一件事就是永远不要接受来自客户端的任何 HTML。 (也许只有我对它进行 HTML 编码。)
我使用输出 HTML 的所见即所得编辑器 (TinyMCE)。到目前为止,我只在管理页面上使用它,但现在我也想在论坛上使用它。它有一个 BBCode 模块,但这似乎不完整。 (BBCode 本身可能不支持我想要的一切。)

所以,这是我的想法:

我允许客户端直接 POST 一些 HTML 代码。然后,我检查代码是否健全(格式良好)并根据预定义的允许标签和样式集删除所有不允许的标签、属性和 CSS 规则。
显然,我会允许我使用的 TinyMCE 功能子集可以输出的内容。

我允许使用以下标签:
span, sub, sup, a, p, ul, ol, li, img, strong, em, br

具有以下属性:
style(对于一切),href and title (for a), alt and src (for img)

以及以下 CSS 规则:
color, font, font-size, font-weight, font-style, text-decoration

这些涵盖了我格式化所需的一切,并且(据我所知)不会带来任何安全风险。基本上,强制执行格式良好和缺乏任何布局样式可以防止任何人损害网站的布局。禁止脚本标签等可以防止 XSS。
(一个例外:也许我应该允许width/height在图像的预定义范围内。)

其他优点:这些东西将使我无需编写/寻找 BBCode-Html 转换器。

你怎么认为?
这是一件安全的事情吗?

(正如我所见,StackOverflow 还允许在“关于我”字段中使用一些基本的 HTML,因此我认为我不是第一个实现此功能的人。)

EDIT:

I found 这个答案 https://stackoverflow.com/questions/3452322/method-to-strip-html-tags-not-in-a-safe-list这解释了如何相当容易地做到这一点。
而且当然,没有人应该考虑为此使用正则表达式 https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454.

这个问题本身与任何语言或技术无关,但如果您想知道,我用 ASP.NET 编写了这个应用程序。


目前尚不清楚您正在使用或喜欢哪种编程语言,但在 Java 中Jsoup http://jsoup.org/,这是一个非常灵活的 HTML 解析器 API,其中包含一个基于可自定义的 HTML 标签和属性白名单的 HTML 清理器(不幸的是没有 CSS 规则,因为这完全超出了 HTML 解析器的范围)。这是相关性的摘录its site http://jsoup.org/cookbook/cleaning-html/whitelist-sanitizer.

清理不受信任的 HTML http://jsoup.org/cookbook/cleaning-html/whitelist-sanitizer

Problem

您希望允许不受信任的用户提供 HTML 以在您的网站上输出(例如作为评论提交)。您需要清理此 HTML 以避免跨站脚本 http://en.wikipedia.org/wiki/Cross-site_scripting(XSS) 攻击。

Solution

使用 jsoup HTMLCleaner http://jsoup.org/apidocs/org/jsoup/safety/Cleaner.html具有指定的配置Whitelist http://jsoup.org/apidocs/org/jsoup/safety/Whitelist.html.

String unsafe = 
      "<p><a href='http://example.com/' onclick='stealCookies()'>Link</a></p>";
String safe = Jsoup.clean(unsafe, Whitelist.basic());
      // now: <p><a href="http://example.com/" rel="nofollow">Link</a></p>

The Whitelist http://jsoup.org/apidocs/org/jsoup/safety/Whitelist.html类本身包含几个可能有用的预定义白名单,例如Whitelist#basic() http://jsoup.org/apidocs/org/jsoup/safety/Whitelist.html#basic%28%29 and Whitelist#relaxed() http://jsoup.org/apidocs/org/jsoup/safety/Whitelist.html#relaxed%28%29.

对于 .NET,顺便说一句,有一个 Jsoup 端口,其名称为NSoup http://nsoup.codeplex.com/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从请求中接受一组预定义的无害 HTML 标记有多安全? 的相关文章

  • 如何强制折断不可折断的字符串?

    我有一个根据数据库中包含的数据生成的 HTML 页面 数据库有时包含浏览器无法分解的长字符串 因为这些字符串不包含可分解的字符 空格 点 逗号等 有没有办法使用 html css 甚至 javascript 来解决这个问题 看到这个link
  • 可以使用带有 HTML5 播放器的 Amazon S3/CloudFront 流式传输视频吗?

    我想使用 HTML5 视频播放器并流式传输视频 S3 CloudFront 可以实现这一点吗 我了解 Amazon 使用 RTMP 流媒体协议和 HTML5video标签不支持 RTMP 有没有办法用 HTML5 播放器播放视频 Wayne
  • PHP 共享标头而不使用服务器端脚本?

    到目前为止我总是通过 PHP 解决简单的问题 您有一个包含页眉 菜单 页脚和内容字段的网站 每个页面的页眉 菜单和页脚通常是相同的 在没有 PHP 或任何其他服务器端语言的情况下 如何使页眉 菜单和页脚数据仅存在于一个文件中 例如 您不会有
  • CSS - div 与父 div 底部对齐(内联块)

    我知道这个 html 很草率 有一些不必要的额外 div 但无论如何 我无法理解为什么 ID 为 info box right 的 div 与父 div 的底部对齐 您可以看到 文本 与下面的 jsfiddle 示例的底部 有什么想法可以让
  • 如何使用 JavaScript 获取元素的填充值?

    我有一个textarea在我的 HTML 中 我需要获取整数或浮点形式的填充数值 以像素为单位 我如何使用 JavaScript 获取它 我没有使用 jQuery 所以我正在寻找纯 JavaScript 解决方案 这将返回padding l
  • Android中webview的截图方法

    我在 webview 中的 html5 canvas 上画了一些线 并尝试使用下面的代码截取 webview 的屏幕截图 WebView webView WebView findViewById R id webview webView s
  • 弹出窗口的动态高度取决于内容,可能吗?

    是否有可能获得一个宽度始终为 400px 的弹出窗口 但根据弹出窗口中的内容动态高度 我已经看到了这个 但不知道如何将其应用到弹出窗口 调整 iframe 的宽度高度以适应其中的内容 https stackoverflow com ques
  • 使用 VBA 通过 Access 导航网页/操作 IE

    你好 StackOverflow 社区 我有一个关于使用 Access VBA 操作 IE 的问题 本质上 我正在尝试编写代码 使用 IE 打开特定网页 在该页面中搜索特定链接 目标链接的名称将取决于用户的情况 通过以编程方式单击该链接导航
  • 如何设置 CSS 网格的最大高度

    我有以下 CSS 网格 grid 3x4 display grid grid template columns 1fr 1fr 1fr grid template rows 1fr 1fr 1fr 1fr grid template are
  • 如何在没有 AM/PM 的情况下使用 datetime-local?

    我想使用以下代码
  • 使用画布仅删除文本而不删除图像

    我正在尝试删除画布元素中的文本 而不丢失Background Image of the Canvas Element 我想我需要保存Imagesrc并把它还给Canvas Element之后clearRect 但我不知道该怎么做 我希望有人
  • 如何在文本区域中使用除“文本插入符号”之外的透明字体?

    我有一个简单的文本区域 我需要制作透明字母 同时允许文本插入符可见 当我应用以下规则时 我会得到隐形插入符 textarea background transparent opacity 0 当我键入不可见文本时 我需要看到文本插入符移动
  • CSS设置默认滚动位置

    有没有办法将滚动位置设置为默认值 我知道如何在 javascript 中做到这一点 例如使用 jquery div divWithScroll attr scrollTop 200 但我只想用CSS来做 我不知道是否可行 不 CSS 中没有
  • 如何使用 a-href 标签链接回文件夹? [复制]

    这个问题在这里已经有答案了 好吧 我在文件夹中有一个页面 该页面称为 jobs html 该文件夹简称为 jobs 它是我的 网站 文件夹的子文件夹 在 main 文件夹的主目录中是我的 home html 文件 当我尝试做的时候 a hr
  • 来自 JSON 的 Angular 8 动态表单

    我正在尝试从 JSON 模式递归生成动态表单 但我正在努力解决找不到表单控件的问题 这是代码示例 我收到这个错误 错误错误 找不到名称为 createdAt 的控件 我尝试了不同的方法 但仍然存在问题 我知道我错过了一些东西 所以请帮忙 任
  • 网站 YouTube 嵌入视频不断播放

    我正在使用 youtube 提供的 iframe 在我的网站上嵌入视频 我还使用了一个 css 弹出窗口 这是我从这个页面学到的http www pat burt com web development how to do a css po
  • Modernizr - 加载 polyfills / 使用自定义检测的正确方法

    我想在网页上使用一些新的 HTML5 表单属性和输入类型 有些浏览器已经支持它们 有些浏览器不支持 也永远不会支持 这就是我想使用 Modernizr 的原因 这就是我的麻烦开始的原因 据我了解 Modernizr 本身并不是一个 poly
  • Jquery 中的动态滚动位置

    请帮助我解决以下情况 我有 3 个页面 当滚动到达第二页时 用户滚动页面 它必须找到特定的 ID 然后触发一个函数 一旦第三页开始 另一个函数就会触发 根据要求我不应该使用任何插件
  • iOS7 中“-webkit-overflow-scrolling: touch” 最初的屏幕外元素被破坏

    既然转基因种子已经发布了 我们现在可以谈谈了 看起来 iOS7 中的 webkit overflow scrolling touch 已损坏 最初不在屏幕上的元素的触摸事件不会触发 或者在某些情况下只是不可靠 这是一个例子
  • JSTL 在循环中每 5 个字段集创建一个新行

    您好 我目前正在迭代并在表中显示字段集列表 为了让布局变得更得体一些 我想在每次循环到达第五个字段集时创建一个新行 谢谢 JSP div class det table class det tr td td tr table div

随机推荐