OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

提高NodeJS网站的安全性:Web服务器防黑客攻击技巧


分享到
分类 骇客攻防   关键字 Node.JS   发布 ourjs  1417057385015
注意 转载须保留原文链接,译文链接,作者译者等信息。  
毫无疑问,Node.js现在是越来越成熟。尽管这样,我们还没有形成很多的安全准则。
在这篇文章中,我会分享一些关于提高Node.js安全性方面的技巧。

不用eval,赢得朋友


你不仅仅要避免使用eval - 你也应该避免使用在下列情况,他们等价于直接使用eval;

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

注* eval: 直接将字符串转化为代码执行,如: eval('alert("hi")')

为什么不要用eval?


如果你对用户输入的内容进行了eval运行(千万不要这么设计),你就有可能受到注入攻击。并且这种运行方式很慢。

请使用Strict严格模式


使用这种模式将限制你的变量声明,并总会将一些可能隐藏的错误抛出来,下面是几个例子:

不可删除的属性


'use strict';
delete Object.prototype; // TypeError

对象属性必须是唯一的


'use strict';  
var obj = {  
    a: 1, 
    a: 2 
}; 
// syntax error

禁止使用with


var obj = { x: 17 };  
with (obj) // !!! syntax error  
{
}

注* 更多参考:
为什么使用"use strict"可以节约你的时间
5个经典的前端面试问题

静态代码分析


使用 JSLint, JSHint 或 ESLint 来静态分析你的代码. 静态代码分析可以让你在早期捕获一些潜在的BUG.

测试


这一点不言而喻:测试,测试再测试。

不仅仅是单元测试,你应该进行全面测试(test pyramid)。


不要直接使用: sudo node app.js


很多人使用超级用户权限运行Node应用,不是吗?因为他们希望应用程序直接侦听80或443端口(注* http和https的默认端口)

这一点是不对的,进程中的任何一个错误/漏洞都将让整个系统宕机,然后你就什么也干不了。

所以你应该使用一个HTTP反向代理服务去转发这些请求。可以用nginx, Apache 你看着办。

注* 相关阅读
NodeJS on Nginx: 使用nginx反向代理处理静态页面
拿什么守护你的Node.JS进程: Node出错崩溃了怎么办?


避免命令(shell command)注入


下面的代码段有什么问题?

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

child_process.exec 命令调用的是 /bin/sh, 它启动了一个解释器,而非程序。

这是有问题的,当该方法执行用户输入的一个方法,比于一个反引号或$()中的内容,一个新的命令就可能被攻击者注入。

为了避免这个问题,你只需要使用child_process.execFile。详解。


临时文件


创建文件时,如处理上传的文件格外注意。这些文件可以轻松吃掉你所有的磁盘空间。

为了解决这个问题,你应该使用Streams。


加密你的Web应用


不光是Node-所有的Web应用程序都应该加密。(注* https)


跨站脚本攻击(Reflected Cross Site Scripting)


发生这种情况时,攻击者注入可执行代码的HTTP响应。一个应用程序容易受到这种类型的攻击,它会在客户端执行未验证的脚本(主要是用Javascript写的)。它使攻击者能够窃取cookie,剪贴板的内容或修改页面本身。

比如

http://example.com/index.php?user=<script>alert(123)</script>

如果这条用户查询未经过验证直接插入到DOM(HTML)中,它就会被执行。

怎么避免


永远不要往DOM中插入不可信的数据
在插入前去除HTML

注* 更多内容
你不知道的JavaScript用法,Hacker是这样写JS的
QQ邮箱是如何泄密的:JSON劫持漏洞攻防原理及演练


防止Cookie被盗


默认情况下,Cookie可以通过Javascript在同一个域中读取。这样可能会被跨站点脚本攻击。而且它们还有可能被第三方的JavaScript库阅读。

例如

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

怎样避免


为了防止这种情况,你可以在Cookies上使用HttpOnly,这个标签可以让JavaScript无法读取这个cookie。 (注* 比如服务器端用到的Cookie)

内容加密策略


内容安全策略(CSP)是一个附加的安全层,帮助检测和缓解某些类型的攻击,包括跨站点脚本(XSS)和数据注入攻击。

CSP可以通过 Content-Security-Policy 被启用。 

比如: 

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

注* CSP的更多内容

这个header头信息将只接收信任的域名及其子域名的发过来的内容。


跨站请求伪造 (Cross-Site Request Forgery)


CSRF是一种迫使终端用户在他目前已验证授权的Web应用程序中执行其它的actions。

这时侯问题就可能发生了,因为cookie也会发送到被请求的网站(此网站你已经被授权) - 即使当这些请求来自不同的位置。

例如

<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,您应该实现同步令牌模式 - 幸运的是,node社区已经帮你做了。下面是它的工作原理:

  • 当发起一个GET请求时,服务器检查你的CSRF令牌 - 如果它不存在,创建一个
  • 当用户显示输入时,确保添加一个隐藏的CSRF令牌值
  • 当Form表单提交时,确保该值与该表单与Session中的内容相匹配

原文地址: 点此
社区评论 ( Beta版 )
OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. NodeJS会是昙花一现吗?
  2. NodeJS就是癌症[2011]
  3. JavaScript的设计缺陷?浮点运算:0.1 + 0.2 != 0.3
  4. Debug调试Node.JS:我们是如何定位内存泄漏和无限循环的
  5. Go语言实例教程基础语法篇(一)
  6. 理解JavaScript中的事件路由冒泡过程及委托代理机制
  7. SpiderMonkey的JavaScript引擎[Firefox]性能超越V8[Chrome]
  8. 基于HTML5和JavaScript实现的Winamp MP3播放器
  9. 什么是IndexedDB:Web离线数据库入门简介及基础教程
  10. 一些你不知道的JavaScript Console调试命令
  11. AirJD-简单好用的免费建站工具

 相关阅读 - 骇客攻防
  1. 浦发银行,请给我们一个解释!
  2. 你不知道的JavaScript用法,Hacker是这样写JS的
  3. QQ邮箱是如何泄密的:JSON劫持漏洞攻防原理及演练
  4. 为什么谷歌的JSON响应以while(1);开头?
  5. 技术宅黑入扎总Facebook主页 称不得已
  6. 创建高安全性PHP网站的几个实用要点
  7. 谷歌明文存储用户密码 与其交付不如自我保护
  8. 十大关系数据库SQL注入工具一览

 关键字 - Node.JS
  1. Node.js框架之express
  2. 在nodejs中使用Redis缓存和查询数据及Session持久化(Express)
  3. Node.JS编码规范指南教程:教你优雅地写JavaScript代码
  4. Express入门教程:一个简单的博客
  5. NodeJS动态传参特性:不定个数参数的省略,默认值与解构
  6. Debug调试Node.JS:我们是如何定位内存泄漏和无限循环的
  7. 6款基于Node.JS的开源内容管理和静态网站生成系统
  8. Node.JS中如何判断递归嵌套的所有回调函数已经执行完毕,以读取目录下所有文件为例:计数比Promise方式快将近一倍
  9. Node.js网页抓取:一个最简单的http请求客户端示例(request client)
  10. 为什么你应该抛弃Express的视图渲染引擎

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号