毫无疑问,Node.js已经变的愈加成熟,尽管这样,开发者仍然缺乏大量的安全指南。在这篇文章中,我将分享一些有关Node.js安全要点给大家,希望大家能够谨记于心。

1.避免使用Eval

Eval并不是唯一一个需要避免的函数,在后台,下面这几个表达式可以使用eval:

setInterval(String, 2)
setTimeout(String, 2)
new Function(String)

为什么要禁止使用eval?因为它

会打开代码引起注入攻击,并且降低运行速度。

2.请用严苛模式(Strict mode)

这种情况下,你可以使用一个受限制的javascript变量,它可以消除一些隐性错误并且会把这些错误抛出去。

3.Undeletable属性

'use strict'; 
delete Object.prototype; // TypeError 
4.对象声明必须是独一无二的
'use strict'; 
var obj = { 
a: 1, 
a: 2 
}; 
// syntax error 
5.Prohibits with
var obj = { x: 17 }; 
with (obj) // !!! syntax error 


}

获得这些隐性错误的完整列表,你可以访问MDN。

6.测试

不用说,测试,测试,多点测试~

当然,不仅仅是单元测试,直戳测试金字塔。

7.对sudo node app.js说再见

我看到很多人在运行拥有超级用户权限的Node APP,为什么?因为他们想让应用程序能够监听80或443端口。

这种做法是错误的。小心一个错误/bug进程就能降低整个系统,因为它已经拥有合法的凭证去做任何事情。

取而代之,你应该设置一个HTTP服务器/代理来转换请求,可以是nginx、Apache等等。

8.避免命令注入

看看下面这段代码有什么问题?

child_process.exec('ls', function (err, data) { 
console.log(data); 
});

child_process.exec调用去执行/bin/sh,所以,这是一个bash注射器,而不是一个程序启动器。

当用户输入的内容传递到这个方法中,就会产生问题——要么是一个\要么就是$(),攻击者很可能会注入一个新的命令。

开发人员可以使用child_process.execFile来解决此类问题。访问LiftSecurity来查看如何处理命令注入。

9.临时文件

开发人员在创建文件时要特别注意,例如处理上传文件。这些文件很容易吃掉你所有的磁盘空间。

解决方法是使用Streams。

10.确保Web应用程序安全

这里不仅仅是针对Node——而是关于如何确保你的Web应用程序安全。

11.跨站脚本反射

当攻击者把代码注入到HTTP响应时,这种情况才会发生。应用程序在返回无效的输入到客户端时(大多数都是基于JavaScript编写的),应用程序很容易遭受这种类型攻击。攻击者可以盗取cookies、执行剪贴板和修改页面本身。

具体示例:

<a href="http://example.com/index.php?user=
<script">http://example.com/index.php?user=<script</a>>alert(2881064151)</script>

如果用户查询字符串在没有验证的情况下被发送回客户端,并且插入到DOM中,它便会执行。

如何预防:

禁止插入不可信的数据到DOM中; 在插入前进行HTML escape。

点击链接可以查看更多关于跨站脚本反射和解决之道。

12.停止Cookie盗窃

默认情况下,在同一个域里,JavaScript可以读取cookies,在跨站脚本攻击里,这是非常危险的。不仅如此,任何第三方JavaScript库都可以读取它们。

var cookies = document.cookie.split('; ');

如何预防:

开发者可以在cookies里面设置httponly标记,这样,JavaScript便无法接近cookie了。

13.内容安全策略(CSP)

CSP(Content Security Policy)是一个额外添加的安全层,它有助于检测和减轻某些类型的攻击,包括跨站脚本(XSS)和数据注入攻击。

通过HTTP header中的Content-Security-Policy方法来启动CSP。

示例

Content-Security-Policy: default-src 'self' *.mydomain.com

这样便会允许内容来自可信域或子域。

点击查看更多有关CSP示例。

14.跨站请求伪造(CSRF)

CSRF(Cross-Site Request Forgery)是一种挟制终端用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

示例:

<body onload="document.forms[0].submit()"> 
<form method="POST" action="http://yoursite.com/user/delete"> 
<input type="hidden" name="id" value="123555."> 
</form> 
</body>

执行上面这段代码的后果就是轻易删除用户配置文件。

如何预防:

要想阻止CSRF,你应该实现同步令牌模式(Synchronizer Token Pattern),幸运的是,Node社区已经帮你完成了这件事。长话短说,一起来看看它的工作原理:

当一个GET请求被服务检查为CSRF令牌——如果不存在,就创建一个; 当用户输入显示时,确保要添加一个隐形的CSRF令牌值; 当发送表单时,确保值是来自表单并且要与session相匹配。

行动

开发者应该有所行动,制作一个Security Adventure车间来指导现实应用开发。

15.保护Express应用程序:Helmet

Helmet是一系列帮助增强Node之Express/Connect等Javascript Web应用安全的中间件。安全功能包括:

csp
crossdomain
xframe
xssfilter
等等

16.使用工具

npm shrinkwrap:该命令可以给一个包的所有依赖关系上锁,并且创建一个npm-shrinkwrap.json文件。更多详情可以访问NPM。 retire.js:retire.js是一个命令行扫描器,帮助你找到你应用中依赖库存在的漏洞。

.保护Express应用程序的更多相关文章

  1. 使用 Acegi 保护 Java 应用程序

    第 1 部分: 架构概览和安全过滤器 Acegi Security System 是一种功能强大并易于使用的替代性方案,使您不必再为 Java 企业应用程序编写大量的安全代码.虽然它专门针对使用 Sp ...

  2. 如何使用 Barracuda 防火墙设置/保护 Azure 应用程序

     如果某企业在 Windows Azure 上托管某个应用程序,该应用程序会在某个特定时间暴露到 Internet,以用于商业用途.公共 Internet 带来 客户的同时也带来了攻击者. Tim ...

  3. Express应用程序目录结构

    1.Node安装与使用 网上有很多Node的安装教程,可以做参考 2.MongoDB的安装与使用 MongoDB安装也有很多教程,可以去网上找找 3.初始化一个express项目 使用express框 ...

  4. Kubernetes实战 - 从零开始搭建微服务 1 - 使用kind构建一个单层架构Node/Express网络应用程序

    使用kind构建一个单层架构Node/Express网络应用程序 Kubernetes实战-从零开始搭建微服务 1 前言 准备写一个Kubernetes实战系列教程,毕竟cnblogs作为国内最早的技 ...

  5. Kubernetes实战 - 从零开始搭建微服务 - 1.5 提高可用性-发布多节点的Node/Express网络应用程序

    1.5 提高可用性-发布多节点的Node/Express网络应用程序 Kubernetes实战 - 从零开始搭建微服务 前言 在上一篇文章中,已经学习了如何简单地开发一个单层网络应用.[Kuberne ...

  6. Azure Front Door(三)启用 Web Application Firewall (WAF) 保护Web 应用程序,拒绝恶意攻击

    一,引言 上一篇我们利用 Azure Front Door 为后端 VM 部署提供流量的负载均衡.因为是演示实例,也没有实际的后端实例代码,只有一个 "Index.html" 的静 ...

  7. Spring Boot Security 保护你的程序

    Spring Boot Security 本示例要内容 基于角色的权限访问控制 加密.解密 基于Spring Boot Security 权限管理框架保护应用程序 String Security介绍 ...

  8. 基于express框架的应用程序骨架生成器介绍

    作者:zhanhailiang 日期:2014-11-09 本文将介绍怎样使用express-generator工具高速生成基于express框架的应用程序骨架: 1. 安装express-gener ...

  9. 反混淆:恢复被OLLVM保护的程序

    译者序: OLLVM作为代码混淆的优秀开源项目,在国内主流app加固应用中也经常能看到它的身影,但是公开的分析研究资料寥寥.本文是Quarkslab团队技术博客中一篇关于反混淆的文章,对OLLVM项目 ...

随机推荐

  1. acm 1002 算法设计

    最近突然想往算法方向走走,做了做航电acm的几道题 二话不说,开始 航电acm 1002 题主要是处理长数据的问题,算法原理比较简单,就是用字符数组代替int,因为int太短需要处理的数据较长 下面是 ...

  2. Python下Json和Msgpack序列化比较

     最近用Python时,遇到了序列化对象的问题,传统的json和新型序列化工具包msgpack都有涉及,于是做一个简单的总结: 通俗的讲:序列化:将对象信息转化为可以存储或传输的形式:反序列化:把这个 ...

  3. 预处理指令 #import

    vs class # import会包含这个类的所有信息,包括实体变量和方法, # @class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,先不考虑.

  4. 51nod1183(Edit Distance)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183 题意:中文题啦- 思路:dp 用dp[i][j]表示从 ...

  5. 【去除NSString 字符串中的空格换行符】

    @interface NSString (DeletWhiteSpace) // 返回一个去掉前后空格的字符串或者下划线,如果自己是一个nil 返回@“” - (NSString *)trimming ...

  6. OC推箱子

    #include<stdio.h> #include<stdlib.h> int main(void) { char sr;//存储用户输入的指令 //绘制地图 char a[ ...

  7. scp 从远程服务器上一下载文件

    scp -P202 xx3.x6.xx.xx:/usr/local/zookeeper-.zip /tmp #指定远程服务器的端口和远程服务器的目标文件 ,最后指定要下载到本的地目录 也可以从远程服务 ...

  8. ***git自动化部署总结

    在网上搜了一堆没用找到太仔细的教程,于是花费2天时间,自己研究了下.现在分享如下: 思路:利用crontab定时去去执行git pull脚本 首先,用git clone命令将中央库的代码下载到阿里云 ...

  9. GTest Google的一种白盒单元测试框架 开源项目

    GTest为google开源的白盒单元测试跨平台测试框架,含丰富的断言.类型参数化测试.死亡测试.以及其他的测试选项设置.文件保存等,以下将对该项目C++的实现进行简要的分析,作为学习记录备份. 基本 ...

  10. 记录一下折腾webp 的过程

    最近有客户想要处理webp 的动图,情况当然是我们并不能处理webp 格式的图片.这事就交给了我来折腾,一开始想着用瑞士军刀ffmpeg.结果是折腾了差不多一天,前前后后编译了几十次ffmpeg 源码 ...