毫无疑问,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. css写出0.5px边框(一)

    在移动端会出现线条太粗的现象,简单来说,是因为手机端的像素单位和ui的图比例是2:1,所以ui图的1px边框对我们来说就是0.5px,但是浏览器渲染的最小单位就是1px,下面给几种方法用css写出0. ...

  2. 第六课 touch事件

    1.移动端页面在PC上浏览时,限制宽度的方法: 2.移动端页面切换设备时自动刷新页面的方法: 3.touch事件 touchstart:当手指触摸屏幕时触发.通过addEventListener添加移 ...

  3. 实现移动设备远程登录linux服务器

    明天下午要考试了.所以最近时间有点紧,都在忙着看矩阵课本,刷刷题. 回到我们博客题目内容,最近正在看linux,之前是通过在笔记本上装着虚拟机的方法来进行操作. 之后发现一些能够进一步改进的地方,首先 ...

  4. Android Studio中Button等控件的Text中字符串默认大写的解决方法

    初学Android的时候,在Android Studio中xml里面添加一个Button.EditText等控件后,它的Text总是会显示大写,即使你输入的字符串是小写也不行,控制字符串大小写的属性是 ...

  5. cout输出控制——位数和精度控制

    刷到一道需要控制输出精度和位数的题目 刚开始以为单纯使用 iomanip 函数库里的 setprecision 就可以,但 OJ 给我判了答案错误,后来一想这样输出并不能限制位数只能限制有效位数. 比 ...

  6. Addthis

    WordPress外贸主题模版可以非常方便地整合国外流行的分享收藏社会化网络功能,比如Addthis是国外一个网络书签按钮聚合网站,是稳步提升网站流量和搜索引擎排名的WEB2.0工具!通过AddThi ...

  7. vue2.0有哪些变化

    vue2.0之后有哪些变化: 1.每个组件模板template,不再支持片段代码 之前: <template> <h3>vue-router+vue-loader</h3 ...

  8. 百度地图API试用--(初次尝试)

    2016-03-17: 百度地图API申请key的步骤相对简单,不做过多阐述. 初次使用百度地图API感觉有点神奇,有些功能加进来以后有点问题,注释掉等有空再解决. 代码如下: <%@ page ...

  9. python 学习第二十一天,django知识(三)

    一,django的url路由系统总结 1,url(/index/,函数或者类) 2,url(/index/(\d+), 函数或者类) 3,url(/index/(?P<nid>\d+),函 ...

  10. 提高ASP.net性能的十种方法

    提高ASP.net性能的十种方法 2014-10-24  空城66  摘自 博客园  阅 67  转 1 转藏到我的图书馆   微信分享:   今天无意中看了一篇关于提高ASP.NET性能的文章,个人 ...