IT技术博客大学习 共学习 共进步

NodeJs下的Web安全

风影博客 2015-06-01 09:54:58 浏览 3,063 次

   Web安全是我们必须关注且无法逃避的话题,本文介绍了各种常见的Web攻击技巧和应对方案,特别针对Node.js这门新兴起的语言,安全更为重要。本文主要参考了《Node.js 实战》这本书,这本书里面除了讲到本文整理的前端安全知识,还给了很多node方面的实例,非常棒!

HTTP管道洪水漏洞

   原理:客户端不接收服务器端的响应,但客户端又拼命发送请求,造成Node.js的Stream流无法泄洪,主机内存耗尽而崩溃

   防范措施:当服务器端在等待stream流的drain事件时,socket和HTTP解析将会停止。在攻击脚本中,socket最终会超时,并被服务器端关闭连接。如果该客户端并不是恶意攻击,只是发送大量的请求,但是响应非常缓慢,那么服务器端响应的速度也会相应降低

SQL注入

   原因:通过把SQL命令插入到Web表单或输入域名或页面请求的查询字符串中,最终达到欺骗服务器执行恶意的SQL命令的目的

   防范措施:保证拼接到SQL查询语句中的变量都经过escape过滤函数,就基本杜绝注入了,也可以用一些比较成熟的ORM框架

   注入事例:

var userId = req.query["id"];  
var sqlStr = 'select * from user where id = "' + userId + '"';  
connection.query(sqlStr, function(err, userObj) {  
  // ...
});

   正常情况下,我们都可以得到正确的用户信息,比如用户通过浏览器访问/user/info?id=11进入个人中心,而我们根据用户传递的ID参数展现此用户的详细信息。但是如果有恶意用户的请求地址为/user/info?id=11";drop table user--,那么拼接成的SQL查询语句就是:select * from user where id = "11";drop table user--。注意:最后连续两个减号表示忽略此SQL语句后面的语句。原本执行查询用户信息的SQL语句,在执行完毕之后会把整个user表丢弃掉!

XSS脚本攻击

   全称:Cross-Site Scripting,为了和CSS层叠样式表区分,所以取名XSS

   原理:它是一种网站应用层序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受影响。这类攻击通常包含HTML标签以及用户端脚本语言

   防范措施:过滤!对用户提交上来的数据保持怀疑,过滤掉其中可能注入的字符,这样才能保证应用安全。推荐工具:XSS过滤模块

CSRF请求伪造

   全称:Cross-Site Request Forgery,它是一种对网站的恶意利用,CSRF比XSS更具危险性

   原理:服务器端的Session对象保存了用户的信息,而客户端利用cookie、ETag等技术保存一个sessionid作为自己的身份标识,然后通过该标识与服务器端打交道。CSRF攻击相当于恶意用户复制了其它用户的身份,然后利用伪造的身份入侵好友用户

   防范措施:用户输入的内容进行严格过滤;提交数据的地方增加隐藏字段;Cookie安全策略,设置HttpOnly防止Cookie劫持;使用安全浏览器

应用层DoS拒绝服务

   应用层一些很小的漏洞,就有可能被攻击者抓住从而造成整个系统瘫痪,包括上面提到的Node.js管道拒绝服务漏洞都是属于这类攻击

   1. 网络层SYN flood攻击:

   原理:利用tcp的设计缺陷,tcp的客户端和服务器端连接需要三次握手。攻击者利用大量肉鸡服务器伪造源IP地址,向服务器端发送SYN包,希望建立tcp连接,服务器端正常响应SYN/ACK包,等待客户端响应。攻击客户端并不会响应这些SYN/ACK包,服务器端判断超时就会丢弃这个连接。如果这些攻击连接数量巨大,最终服务器就会因为等待和频繁处理这种半连接而失去对正常请求的响应,从而导致拒绝服务攻击成功

   防范措施:硬件防火墙

   2. 超大Buffer

   原理:客户端上传超大文件,导致服务器端内存耗尽

   防范措施:每次收到buffer块都比较其大小,如果数据超大则立刻截断上传

   3. Slowlori攻击

   原理:POST慢速攻击。针对配置较低的服务器,攻击者先向Web应用服务器发起一个正常的POST请求,设定一个在Web服务器限定范围内且比较大的Content-Length,然后以非常慢的速度发送数据,比如30秒左右发送一次10byte的数据给服务器,保持这个连接不释放,这样服务器的一个tcp连接就一直被一个慢速的POST占用,极大浪费服务器资源

   防范措施:利用Nginx

   4. HTTP Header攻击

   原理:一般Web服务器都会设定HTTP请求头的接收时长,是指客户端在指定的时长内必须把HTTP的head发送完毕。如果Web服务器在这方面没有做限制,我们也可以用同样的原理慢速发送head数据包,造成服务器连接的浪费

   防范措施:设置请求响应头大小

   5. 正则表达式

   原理:日常使用的正则表达式,如果书写不够规范可能成为恶意用户的攻击的对象。正则表达式引擎NFA具有回溯性,回溯的一个重要影响是,虽然正则表达式可以相当快速地计算确定匹配,但确认否定匹配所需时间会稍长

   防范措施:提高正则表达式健壮性

文件路径漏洞

   原理:Node.js提供的HTTP模块是非常底层的,所以很多工作需要开发者自己来完成,可能因为业务比较简单,不去使用成熟的框架,在写代码时稍不注意就会带来安全隐患。如:文件名和保存路径直接拼接,让相对路径有机可乘,从而入侵服务器

   防范措施:利用Node提供的一些函数

加密安全

   传统的加/解密有:对称加密(AES、DES)、非对称加密(RSA)、不可逆加密(MD5、SHA-1)

   原理:同一个字符串经过MD5哈希计算后总是会生成相同的加密字符串,所以攻击者可以利用强大的MD5彩虹表来逆推加密前的原始字符串 MD5破解工具

   防范措施:在user表中添加salt字段,每次注册都要随机生成一个位数足够长的salt字符串,然后再根据这个salt值加密密码

结语

   建议:Node.js部署到生产环境时,将Node.js应用放置在成熟的Nginx等Web服务器后方;对于例如SQL、XSS等注入式攻击,我们一定要对用户输入的内容进行严格的过滤和审查,这样可以避免绝大多数的注入式攻击方式;对于Dos攻击我们需要使用各种工具和配置来减轻危害;最后我们需要做好严密的系统监控,一旦发现有异常,必须能马上做出合理的响应措施。

参考

建议继续学习

  1. Node.js 给前端带来了什么 (阅读 5,562)
  2. 利用node.js搭建SPDY协议的翻墙服务 (阅读 3,840)
  3. Node.js和testacular的安装与配置 (阅读 3,186)
  4. 使用Node.js、Twilio实现手机控制门锁 (阅读 2,925)
  5. Node.js 打造实时多人游戏框架 (阅读 2,702)
  6. 探究 Node.js 中的 drain 事件 (阅读 2,003)
  7. Node.js Web应用代码热更新的另类思路 (阅读 1,801)
  8. 由NodeJieba谈谈Node.js异步实现 (阅读 1,643)