.保护Express应用程序
毫无疑问,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应用程序的更多相关文章
- 使用 Acegi 保护 Java 应用程序
第 1 部分: 架构概览和安全过滤器 Acegi Security System 是一种功能强大并易于使用的替代性方案,使您不必再为 Java 企业应用程序编写大量的安全代码.虽然它专门针对使用 Sp ...
- 如何使用 Barracuda 防火墙设置/保护 Azure 应用程序
如果某企业在 Windows Azure 上托管某个应用程序,该应用程序会在某个特定时间暴露到 Internet,以用于商业用途.公共 Internet 带来 客户的同时也带来了攻击者. Tim ...
- Express应用程序目录结构
1.Node安装与使用 网上有很多Node的安装教程,可以做参考 2.MongoDB的安装与使用 MongoDB安装也有很多教程,可以去网上找找 3.初始化一个express项目 使用express框 ...
- Kubernetes实战 - 从零开始搭建微服务 1 - 使用kind构建一个单层架构Node/Express网络应用程序
使用kind构建一个单层架构Node/Express网络应用程序 Kubernetes实战-从零开始搭建微服务 1 前言 准备写一个Kubernetes实战系列教程,毕竟cnblogs作为国内最早的技 ...
- Kubernetes实战 - 从零开始搭建微服务 - 1.5 提高可用性-发布多节点的Node/Express网络应用程序
1.5 提高可用性-发布多节点的Node/Express网络应用程序 Kubernetes实战 - 从零开始搭建微服务 前言 在上一篇文章中,已经学习了如何简单地开发一个单层网络应用.[Kuberne ...
- Azure Front Door(三)启用 Web Application Firewall (WAF) 保护Web 应用程序,拒绝恶意攻击
一,引言 上一篇我们利用 Azure Front Door 为后端 VM 部署提供流量的负载均衡.因为是演示实例,也没有实际的后端实例代码,只有一个 "Index.html" 的静 ...
- Spring Boot Security 保护你的程序
Spring Boot Security 本示例要内容 基于角色的权限访问控制 加密.解密 基于Spring Boot Security 权限管理框架保护应用程序 String Security介绍 ...
- 基于express框架的应用程序骨架生成器介绍
作者:zhanhailiang 日期:2014-11-09 本文将介绍怎样使用express-generator工具高速生成基于express框架的应用程序骨架: 1. 安装express-gener ...
- 反混淆:恢复被OLLVM保护的程序
译者序: OLLVM作为代码混淆的优秀开源项目,在国内主流app加固应用中也经常能看到它的身影,但是公开的分析研究资料寥寥.本文是Quarkslab团队技术博客中一篇关于反混淆的文章,对OLLVM项目 ...
随机推荐
- acm 1002 算法设计
最近突然想往算法方向走走,做了做航电acm的几道题 二话不说,开始 航电acm 1002 题主要是处理长数据的问题,算法原理比较简单,就是用字符数组代替int,因为int太短需要处理的数据较长 下面是 ...
- Python下Json和Msgpack序列化比较
最近用Python时,遇到了序列化对象的问题,传统的json和新型序列化工具包msgpack都有涉及,于是做一个简单的总结: 通俗的讲:序列化:将对象信息转化为可以存储或传输的形式:反序列化:把这个 ...
- 预处理指令 #import
vs class # import会包含这个类的所有信息,包括实体变量和方法, # @class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,先不考虑.
- 51nod1183(Edit Distance)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183 题意:中文题啦- 思路:dp 用dp[i][j]表示从 ...
- 【去除NSString 字符串中的空格换行符】
@interface NSString (DeletWhiteSpace) // 返回一个去掉前后空格的字符串或者下划线,如果自己是一个nil 返回@“” - (NSString *)trimming ...
- OC推箱子
#include<stdio.h> #include<stdlib.h> int main(void) { char sr;//存储用户输入的指令 //绘制地图 char a[ ...
- scp 从远程服务器上一下载文件
scp -P202 xx3.x6.xx.xx:/usr/local/zookeeper-.zip /tmp #指定远程服务器的端口和远程服务器的目标文件 ,最后指定要下载到本的地目录 也可以从远程服务 ...
- ***git自动化部署总结
在网上搜了一堆没用找到太仔细的教程,于是花费2天时间,自己研究了下.现在分享如下: 思路:利用crontab定时去去执行git pull脚本 首先,用git clone命令将中央库的代码下载到阿里云 ...
- GTest Google的一种白盒单元测试框架 开源项目
GTest为google开源的白盒单元测试跨平台测试框架,含丰富的断言.类型参数化测试.死亡测试.以及其他的测试选项设置.文件保存等,以下将对该项目C++的实现进行简要的分析,作为学习记录备份. 基本 ...
- 记录一下折腾webp 的过程
最近有客户想要处理webp 的动图,情况当然是我们并不能处理webp 格式的图片.这事就交给了我来折腾,一开始想着用瑞士军刀ffmpeg.结果是折腾了差不多一天,前前后后编译了几十次ffmpeg 源码 ...