从请求中接受一组预定义的无害 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

    jQuery 或 JavaScript 中是否有任何事件在以下情况下触发span标签 text html 已更改 Code span class user location span user location change functio
  • 有没有办法在 html 图像标签中显示位图数据? [复制]

    这个问题在这里已经有答案了 有没有办法在 HTML 元素中显示位图图像数据 例如 您有一个指向源文件的常规图像 如下所示 img src myImage png width 100 height 100 有没有这样的事情 img width
  • JavaScript 访问密码字段值是否被视为存在安全风险?

    如果安全 正确地存储密码是良好的风格和安全性 那么对于要求用户输入密码的网页来说不应该也是如此吗 考虑这个例子
  • 如何使用 PHP 正确添加跨站请求伪造 (CSRF) 令牌

    我正在尝试为我网站上的表单添加一些安全性 其中一个表单使用 AJAX 另一个表单是简单的 联系我们 表单 我正在尝试添加 CSRF 令牌 我遇到的问题是令牌有时只显示在 HTML 值 中 其余时间 该值为空 这是我在 AJAX 表单上使用的
  • 数字和小数的输入掩码

    在测试我的程序后 我发现了以下错误 我在 sqlserver 中的表包含 价格数字 6 2 我的程序的用户输入价格 555 00 就很好了 但是当他输入 555555 时 这是错误的 所以我需要指定掩码 其中尾数是可选的 0 到 999 小
  • 如何更改 Shiny 中 navbarPage 折叠的断点

    我想用shiny navbarPage collapsible TRUE 当在小屏幕上查看我的 Shiny 应用程序时 将导航元素折叠到菜单中 默认情况下 当浏览器宽度小于 940 像素时会触发折叠 有什么方法可以改变这一点 以便在稍大的浏
  • 使用滤镜将css3灰色图像转为蓝色?

    我正在尝试将灰色图像变为更蓝色的色调 真的不知道如何为此设置滤镜或是否可能 该图像只有一种颜色 cacaca 其余部分透明 我正在尝试使用相同的图像进行一些叠加 以便它仅突出显示那些彩色部分而不是透明区域 一直在尝试其中的一些 但没有取得多
  • 占位符 HTML 元素?

    是否有任何 HTML 元素可以用来包装其他元素以用作占位符 例如 ul ul
  • 两个 Div 之间的固定宽度间隙

    有谁知道如何修复两个 div 之间的间隙 我有一个主要内容 Div 里面有两个带有图片的 Div 视图的宽度为 768 像素 当我开始拉伸视图时 两张图片开始相互远离 但理想情况下 主要内容 Div 应该在周围有空白的情况下拉伸 并且图片之
  • 通过 JavaScript 检测浏览器换行

    我需要 javascript 来检测每个浏览器包装的文本行并将其包装到 span class line 我读过一些关于测量每个单词的 y 轴的文章 但还没有看到可靠的解决方案 这是我到目前为止所拥有的 看到它Jsfiddle http js
  • 使用纯javascript选择最接近id的id

    div div TEXT div div div div TEXT div div div TEXT div 如何选择最接近div1的div2 关注w3docs https www w3 org TR html4 struct global
  • PyCharm 中有 HTML 块 {%%} 的快捷方式吗?

    我正在使用 HTML 块 例如 block content 经常使用 但必须输入括号和百分比符号很麻烦 有没有捷径或其他方法可以自动执行此操作 到目前为止我刚刚发现这个 PyCharm 中有插入 的快捷方式吗 https stackover
  • 将样式添加到 mat-autocomplete 的 mat-option

    我有这个 HTML代码在这里 https stackblitz com edit angular mat autocomplete with selected value vx1uqg file src 2Fapp 2Fautocomple
  • HTML 中部分着色的阿拉伯语单词

    我不会说阿拉伯语 但我需要我们网站上对阿拉伯语的具体支持 我需要将部分阿拉伯语单词放在 span 与单词其他部分的风格不同 当我输入两个字符时 and 它们被组合成word 但是当我使用 HTML 标记时 span span 这些字母在输出
  • 如何在使用页面锚点导航时设置“激活”类以在 Angular 2 中引导导航栏?

    我正在使用 Angular 2 和 Bootstrap 4 创建一个单页网站 我创建了一个始终位于页面顶部的导航栏组件 并且我正在使用页面锚点导航 id 请注意 我还没有创建路由模块 到目前为止还没有必要这样做 导航栏代码如下
  • 动态img(或视频)标签根本不加载资源,HTTP请求处于“待处理”状态

    我尝试使用以下方法在 Web 应用程序上加载资源时遇到一些问题img or videoHTML 标签 我在我的应用程序中使用 Angular 并动态设置src的参数img标签 使用ng src src 指示 没有那么多图像和资源需要加载 在
  • 避免响应式页面的重复内容

    我目前正在做一个涉及响应式设计的项目 整个布局应该使用HTML和CSS来实现 我知道可以使用 java 脚本将内容从一个列布局移动到另一列布局 而无需复制内容 但是使用 HTML 和 CSS 是否可以实现相同的效果 以下面的例子为例 它会在
  • 如何在jquery中以相反的顺序迭代元素? [复制]

    这个问题在这里已经有答案了 我是jquery的新手 我想知道如何使用each 在jquery中以相反的顺序迭代表单元素 任何帮助 将不胜感激 尝试这个 input get reverse each function
  • 如何获取浏览器视口中当前显示的内容

    如何获取当前正在显示长文档的哪一部分的指示 例如 如果我的 html 包含 1 000 行 1 2 3 9991000 并且用户位于显示第 500 行的中间附近 那么我想得到 500 n501 n502 或类似的内容 显然 大多数场景都会比
  • 如何在 AngularJS 循环内使用标签

    所以我在里面ng repeat像这样 li li

随机推荐