客户端HTML清理有多安全?

PW *_*Kad 9 html javascript javascript-injection angularjs knockout.js

我最近一直在寻找Pagedown.js,因为在我的页面上使用mark-down而不是丑陋的readonly textareas.

我非常谨慎,因为它似乎很容易欺骗消毒的转换器.我已经看到围绕Angular.js进行了一些讨论,并且它是html绑定,并且当Knockout.js 3.0出现以前曾经存在对html绑定的不安全感时也听到了一些内容.

似乎所有人都需要做的就是在Pagedown.js中禁用清洁剂,例如:

var safeConverter = new Markdown.Converter();
// safeConverter is open to script injection

safeConverter = Markdown.getSanitizingConverter();
// safeConverter is now safe

// Override the getSanitizingConverter pseudo-code
Markdown.getSanitizingConverter = function () {
    return Markdown.Converter;
};
Run Code Online (Sandbox Code Playgroud)

他们可以打开一个站点,直到脚本注入.这不是真的吗?

编辑

那么为什么像这样的图书馆使用消毒剂来使用客户端呢?当然他们说不要渲染未经过清理的HTML,但下一行说使用Markdown.Sanitizer ..

Angular如何通过消毒杀菌剂服务不对它开放,或者这只是一场闹剧?

gka*_*pak 18

我认为对这种"消毒剂"的目的和性质存在一点误解.

清洁剂(例如Angular ngSanitize)的目的不是防止将"坏"数据发送到服务器端.反过来说是另一种方式:消毒剂可以保护非恶意用户免受恶意数据的攻击(服务器端的安全漏洞(是的,没有设置是完美的)或从其他来源获取(那些你无法控制的)).

当然,作为客户端功能,可以绕过清洁剂,但是(因为清洁剂是为了保护用户(而不是服务器))绕过它只会使旁路没有受到保护(你无法做任何事情) ,你也不应该关心 - 这是他们的选择).

此外,消毒剂(罐头)还有另一个(可能更重要的)角色:消毒剂是一种工具,可以帮助开发人员更好地组织他们的代码,使其更容易测试某些类型的漏洞(例如XSS攻击),甚至是有助于对这类安全漏洞进行实际的代码审计.

在我看来,Angular文档非常巧妙地总结了这个概念:

严格上下文转义(SCE)是一种模式,其中AngularJS需要在某些上下文中进行绑定,以产生一个标记为可安全用于该上下文的值.
[...]
SCE次助攻,在写作方式的代码(A)是默认的安全和(b),使审计的安全漏洞,如XSS,点击劫持等方便很多.

[...]
在一个更现实的例子中,可能是通过绑定呈现用户评论,博客文章等.(HTML只是渲染用户控制的输入会产生安全漏洞的上下文的一个示例.)

对于HTML的情况,您可以在客户端或服务器端使用库来清理不安全的HTML,然后再绑定到值并在文档中呈现它.

您如何确保使用这些类型的绑定的每个地方都绑定到您的库清理过的值(或者您的服务器可以安全地返回?)如何确保您不会意外删除该行?清理了值,或重命名了一些属性/字段,忘了更新绑定到已清理的值?

为了确保安全,您需要确保不允许任何此类绑定,除非您可以确定某些内容明确表示在该上下文中使用绑定值是安全的.然后,您可以审核您的代码(一个简单的grep会这样做),以确保只对那些您可以轻松告诉他们安全的值进行此操作 - 因为它们是从您的服务器接收的,由您的库清理等等.您可以组织您的代码库来帮助解决这个问题 - 也许只允许特定目录中的文件执行此操作.确保该代码公开的内部API不会将任意值标记为安全,然后变为更易于管理的任务.

注1:重点是我的.
注2:对于冗长的引用感到抱歉,但我认为这是一个非常重要(尽可能敏感)的问题,而且常常被误解.


The*_*Wes 8

你无法消毒客户端.任何人都可以随时关闭JavaScript或更改值并将其提交到您的服务器.

服务器需要仔细检查.在我看来,客户端实际上只是一个可用性功能.所以他们知道他们输入的是错误还是正确.

为了回应编辑:

其中大多数是方便或提供功能.例如,不引人注意的验证会使我的文本框变为红色,如果它们输入的数字无效.这很好,我不需要发布和检查,然后更改文本框边框blablablabla ...

但是当他们发帖时,我仍然需要验证他们的数据.我通常将其保存在一个核心库中,该库可以跨应用程序共享(Web,Web服务,移动应用程序,胖客户端等)

可用性验证因平台而异.但在核心,在任何应用程序信任数据之前,它必须在其信任障碍内检查它.没有人可以改变我if在服务器上的价值,但是任何人都可以在不绊倒我的JS的情况下更改浏览器中的值.

  • 是的,你可以在客户端消毒(这也是一个好主意).消毒!==验证 (2认同)
  • @RobertMallow:你也不需要。 (2认同)