没有绝对安全,只有相对安全。作为开发者,我们要在日常开发中对『安全』需怀着敬畏之心,积极培养自己的安全意识。以下是一些 Node.js 安全相关的规范。
Debug 开启时,会暴露很多能被黑客利用的服务器信息,所以,生产环境下请 必须 确保关闭所有Debug的操作
跨站脚本攻击(cross-site scripting,简称 XSS),具体危害体现在黑客能控制你网站页面,包括使用 JS 盗取 Cookie 等,关于 XSS 的介绍请前往 IBM 文档库:跨站点脚本攻击深入解析 。
默认情况下,在无法保证用户提交内容是 100% 安全的情况下,必须 对用户内容进行转义。
在使用 run() 来编写复杂查询语句时,必须 使用数据绑定。
错误的做法:
const name = 'admin'; // 假设用户提交
const password = "xx' OR 1='1"; // // 假设用户提交
const sql = `SELECT * FROM users WHERE name ='${name}' and password = '${password}'`
db.run(sql);以下是正确的做法,利用 select 方法 的第二个参数做数据绑定:
const name = 'admin'; // 假设用户提交
const password = "xx' OR 1='1"; // // 假设用户提交
const sql = 'SELECT * FROM users WHERE name = ? and password = ?'
db.run(sql, [name, password]);批量赋值安全威胁,指的是用户可更新本来不应有权限更新的字段。举例,user 表里的 is_admin 字段是用来标识用户『是否是管理员』,某不怀好意的用户,更改了『修改个人资料』的表单,增加了一个字段:
<input name="is_admin" value="1" />这个时候如果你更新代码如下:
const data = ctx.params
db.update(user, data);此用户将获取到管理员权限。可以有很多种方法来避免这种情况出现,最简单的方法是通过设置 User 路由,限定传入的参数
CSRF 跨站请求伪造是 Web 应用中最常见的安全威胁之一,具体请见 Wiki - 跨站请求伪造 或者 Web 应用程序常见漏洞 CSRF 的入侵检测与防范。