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 客户端密钥/令牌
身份验证信息以及授权信息的保存场所
这里,按以下分类来介绍。
推荐【仅管理员(有特定权限的人)可查看】的保存场所
不推荐【一般用户也可以查看】的保存场所
此处介绍的内容仅供参考。慎重起见,再次提醒请慎重考虑保存场所以防泄露!
推荐的保存场所
后台(服务器内的数据库或无服务器平台等)
kintone 插件的Proxy ※1
kintone.plugin.app.setProxyConfig() 、kintone.plugin.app.getProxyConfig()
HttpOnly的Cookie ※2
※1: 通过插件来进行kintone自定义的话,可以使用Proxy来限制仅应用的管理员可查看验证信息或授权信息。
详情请参考“kintone插件开发入门【Part2: 信息的隐藏方法篇】”。
※2: HttpOnly 的 Cookie可以防止来自JavaScript的访问。
不推荐的保存场所
前台程序(例:kintone JavaScript自定义)
Web Storage( localStorage 、sessionStorage)
kintone 插件的设置
kintone.plugin.app.setConfig() 、kintone.plugin.app.getConfig()非HttpOnly的Cookie
作为比较常见的验证信息保存场所之一的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