安全编码指南

cybozu发表于:2016年08月24日 13:08:43更新于:2023年04月07日 12:12:15

Index

概要

使用API时,便利的同时也伴随着下述的风险。

  • 发生安全性上的问题

  • cybozu.cn的服务无法正常运行

这个页面将对使用kintone API编码的注意事项进行说明。

防止跨站脚本攻击及CSS注入

跨站脚本攻击(Cross-site scripting,通常简称为XSS)是指,可根据用户输入的内容动态生成网页的程序向浏览器发送恶意代码,并使其执行恶意代码的漏洞。

和XSS一样,CSS也可以通过在网页插入并使其执行带有恶意的CSS代码。
可能带来类似这种攻击的漏洞称为“CSS注入”。

可能发生的威胁

如果运行带有XSS或者CSS注入的程序,可能发生下面这样的情况。

  • kintone数据泄露

  • 显示虚假页面

  • web浏览器端储存带有恶意的Cookie

带有脆弱性的代码例子

const text1 = document.getElementById('text1');
const div1 = document.getElementById('div1');
div1.innerHTML = '<input type="text" value="' + text1.value + '" />';

这个代码,是将输入框text1 的值显示出来。如果在输入框text1 里输入下面这样的值,将会执行与当初开发者的设想完全不一样的代码。

"onclick="alert(1)

对策

对所有要输出的元素进行转义处理

外部输入递交给程序的字符串里,针对含有特殊意义的文字( < 、> 、”)做转义处理。但是,针对HTML元素进行恰当的转义处理,需要掌握很多的知识。因此,建议尽可能地避免使用document.write和 innerHTML来动态生成HTML。当然,使用innerText来代替innerHTML,也能防止大多数的XSS。

要输出的URL必须以 http://  或 https://  开头

当基于外部的输入,需要动态生成 a 标签 href 属性和 img 标签 src 属性的URL时,输入以javascript: 开头的字符串可能会嵌入脚本代码。为了防止这个,可以只输出以 http:// 和 https:// 开头的URL。

避免使用外部输入值来生成元素

不可使用下面的这种编码方式。这里untrusted表示外部输入的值。

tag = document.createElement("script");

// 避免使用innerHTML
tag.innerHTML = untrusted;

// 推荐使用innerText
tag.innerText = untrusted;

不调用可疑的外部网站里的JavaScript 和 CSS

由于脚本是可以更改的,很有可能链接的外部网站脚本,某天会忽然变成盗取数据的程序。因此,在确定调用外部脚本的时候,请仔细斟酌被调用的网站是否是可靠的。

使用HTTPS进行通信

cybozu.cn的服务,根据HTTPS对客户的Web浏览器通信进行了加密。因此在与第三方整合时,也需要使用可支持HTTPS的API。

妥善处理身份验证信息和授权信息

与第三方服务整合时,需要将第三方服务的验证信息或者授权信息保存在某个地方。

由于保存不当可能导致验证信息泄露,因此请务必慎重考虑验证信息以及授权信息的保存场所(限制验证信息的查看权限)。
特别是在进行JavaScript自定义时,往往容易将验证信息保存在一般用户也可以看到的地方。

身份验证信息/授权信息的例子

  • 密码

  • API密钥

  • OAuth 客户端密钥/令牌

身份验证信息以及授权信息的保存场所

这里,按以下分类来介绍。

  • 推荐【仅管理员(有特定权限的人)可查看】的保存场所

  • 不推荐【一般用户也可以查看】的保存场所

此处介绍的内容仅供参考。慎重起见,再次提醒请慎重考虑保存场所以防泄露!

推荐的保存场所

  • HttpOnly的Cookie ※2

※1: 通过插件来进行kintone自定义的话,可以使用Proxy来限制仅应用的管理员可查看验证信息或授权信息。
详情请参考“kintone插件开发入门【Part2: 信息的隐藏方法篇】”。

※2: HttpOnly 的 Cookie可以防止来自JavaScript的访问。

不推荐的保存场所

作为比较常见的验证信息保存场所之一的Web Storage,可通过任意的JavaScript对其进行访问。
另外,kintone插件的设置以及非HttpOnly 的 Cookie也可以通过JavaScript访问。
因此,当访问带有恶意的网站时,验证信息或授权信息可能会被非法使用。


妥善保存获取的数据

从cybozu.cn那取得的数据,可能包含了个人信息和机密信息。如这些信息要保存在外部应用里,请将这点考虑到程序设计及后续的运营里,避免由于数据的泄漏而造成的损失。 

利用JavaScript进行自定义时其他需要注意的地方

跨域限制

由于跨域限制、使用了XHR(XMLHttpReuest) 的cybozu.cn和外部网站无法通信。在头部里无法添加Access-Control-Allow-Origin 。

使用JavaScript取得Cookie

cybozu.cn的Cookie里由于附加了httponly属性,因此无法用JavaScript来取得cybozu.cn的Cookie 。

重定向到外部网站

基于外部输入值动态生成的URL赋值给以下对象时,请核实该URL,在确认的基础上编码。

  • location.href

  • document.location

  • window.open

使用严格(strict)模式

使用JavaScript的严格(strict)模式,就可以防止编码上的失误,制作出安全的东西。详细的严格(strict)模式说明可以参考 MDN文档

严格(strict)模式主要的特征

  • 只能赋值给事先声明过的变量

  • eval函数里定义的变量的作用域,只在这个函数内有效

  • 不支持arguments.calee

"use strict";
mistypedVaraible = 17; // throws a ReferenceError