当前位置: 首页 > 面试题库 >

客户端HTML清理的安全性如何?

马魁
2023-03-14
问题内容

最近,我一直在查看Pagedown.js,以在页面上使用mark-down而不是丑陋的只读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;
};

他们可以打开一个站点进行脚本注入。那不是真的吗

编辑

那么,为什么这样的库会打包一个净化器以使用客户端呢?当然,他们说不要渲染未经消毒的html,但下一行说要使用Markdown.Sanitizer。

Angular如何不使用消毒剂服务,还是闹剧呢?


问题答案:

我相信对这种“消毒剂”的目的和性质有些误解。

清理程序(例如Angular的ngSanitize)的目的 不是 防止“不良”数据发送到服务器端。相反,这是另一种方式:那里有一个消毒程序来
保护 非恶意用户免受恶意数据的 侵害 (是由于服务器端的安全漏洞(是的,没有任何设置是完美的)或从其他来源获取的)(那些您无法控制的))。

当然,作为客户端功能,可以绕过消毒剂,但是(因为有消毒剂可以保护用户(而不是服务器)),绕过它只会使绕过器不受保护(您不能对此做任何事情) ,您也不必在乎-
这是他们的选择)。

此外,清理程序还可以扮演另一个(可能更重要的)角色:清理程序是一种工具,可以帮助开发人员更好地组织其代码,从而更易于测试某些类型的漏洞(例如XSS攻击),甚至帮助进行此类安全漏洞的实际代码审核。

在我看来, Angular文档
很好地总结了这个概念:

严格上下文转义(SCE)是一种模式,其中AngularJS要求在某些上下文中进行绑定以产生一个值,该值被标记为可安全用于该上下文。
[…]
SCE以以下方式帮助编写代码:(a) 默认情况下是安全的, 并且(b)使得对安全漏洞(例如XSS,clickjacking等)的 审核
更加容易

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

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

您如何确保使用这些类型的绑定的每个位置都绑定到由库清理过的值(或返回为服务器可以安全渲染的值)?如何确保您不会意外 删除该行消毒 过的值,或者
重命名了某些属性/字段 ,却忘记了更新与消毒过的值的绑定?

为了安全 起见 ,默认情况下,您要确保禁止任何此类绑定,除非您可以确定 明确表示 在该上下文中使用值进行绑定 是安全的
。然后,您可以 审核您的代码 (只需执行简单的grep即可),以确保仅针对那些您可以轻易告知的安全值进行此操作-
因为这些值是从服务器接收到的,由库进行了清理,等等。您可以 组织自己的代码代码库来解决这个问题
-也许只允许特定目录中的文件执行此操作。确保该代码公开的内部API不会将任意值标记为安全值,这样就变得 更加易于管理

注1: 重点是我的。
注2: 很抱歉提供冗长的报价,但是我认为这是一件非常重要的事情(尽管很敏感),并且经常被人们误解。



 类似资料:
  • firebase确实提供了客户端sdk和服务器端管理sdk来使用firebase云消息传递。 让我困惑的是: 我们在公共javascript文件或脚本标记中包含客户端初始化代码。是否有人无法查看此初始化凭据并直接向连接到我们的应用程序的设备发送post请求?如果用户不断发送垃圾邮件或恶意通知,该怎么办?整个FCM功能不应该只由AdminSDK提供吗? 我正在为一个项目的nodejs应用程序使用fi

  • 我的Python secure websocket客户端代码给出了以下异常: [SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败(_SSL.C:748) 我已经创建了我的私有证书和签名证书,但我无法使用Python脚本连接到它,如下所示: 我的HTTPS/WSS服务器脚本用tornado用python编写,如下所示: 用于创建SSL签名证书的步骤:

  • 问题内容: 我有X.509证书保护的远程Web服务。 我生成了Web服务客户端的内容(使用jax-ws),但是需要配置是否用于证书的用途。 我应该如何进行? 我想我应该在本地信任的密钥库中注册证书,并且它们设置如下所示: 但是尚不清楚应提供哪些数据作为参数。 请帮忙。 谢谢。 问题答案: 密钥库属性定义用于向服务器标识您的证书: 这是带有x509证书的Java密钥库。您可以使用Java程序keyt

  • null SAP对其服务的评价: 用于XML签名的消息格式 SOAP消息必须包括以下数据:

  • 我一直在进入Quarkus并试图利用叛变Vertx网络客户端。我的代码可以工作,但我不希望依赖不安全/未检查的分配,这就是我目前在HttpResponse上使用bodyAsJson方法编写代码的方式。有没有更好的方法,或者更标准的方法来解码来自Mutiny Vertx客户端的JSON?我意识到我可以调用bodyAsJsonObject并返回它,但我需要对API调用返回的数据进行处理,所以我需要将其