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

简介: 毫无疑问,Node.js现在是越来越成熟。尽管这样,我们还没有形成很多的安全准则。在这篇文章中,我会分享一些关于提高Node.js安全性方面的技巧。

毫无疑问,Node.js现在是越来越成熟。尽管这样,我们还没有形成很多的安全准则。

在这篇文章中,我会分享一些关于提高Node.js安全性方面的技巧。

不用eval,赢得朋友

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

setInterval(String, 2)

setTimeout(String, 2)

newFunction(String)

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

为什么不要用eval?

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

请使用Strict严格模式

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

1.不可删除的属性

'use strict';

deleteObject.prototype; // TypeError

2. 对象属性必须是唯一的

'use strict';  

var obj = {  

   a: 1,

   a: 2

};

// syntax error

3.禁止使用with

var obj = { x: 17 };  

with (obj) // !!! syntax error  

{

}

静态代码分析

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

测试

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

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

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

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

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

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

避免命令(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

防止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中的内容相匹配

相关文章
|
9天前
|
中间件 Java 应用服务中间件
Windows部署web应用服务器Jboss中间件
如何在Windows系统上部署JBoss 7.1作为Web应用服务器,包括配置环境变量、自动部署WAR包、访问JBoss控制台、设置管理员账户以及修改端口和绑定地址等操作。
25 1
|
3天前
|
缓存 NoSQL 数据库
高性能Web服务器架构设计
【8月更文第28天】在当今互联网时代,网站的响应速度直接影响用户体验和业务成功率。因此,构建一个高性能的Web服务器架构至关重要。本文将从硬件配置、软件架构以及网络设置三个方面探讨如何提高Web服务器的性能,并提供一些实际的代码示例。
16 0
|
8天前
|
存储 安全 数据可视化
如何规避DDoS攻击带来的风险?服务器DDoS防御软件科普
如何规避DDoS攻击带来的风险?服务器DDoS防御软件科普
25 0
|
16天前
|
开发框架 缓存 .NET
并发请求太多,服务器崩溃了?试试使用 ASP.NET Core Web API 操作筛选器对请求进行限流
并发请求太多,服务器崩溃了?试试使用 ASP.NET Core Web API 操作筛选器对请求进行限流
|
23天前
|
存储 前端开发 搜索推荐
Web前端网站(三)- 记事本
【8月更文挑战第8天】多种颜色搭配的动态粒子背景特效(粒子会随着鼠标的移动进行吸附,好看又好玩),左右摆动的文字特效,并且使用localStorage进行数据的持久化存储,使记事本的内容可以长期的保存在浏览器中,功能包括添加留言、显示留言、删除留言。每一行代码都有详细注释~~~大家可以尽情创作
37 5
Web前端网站(三)- 记事本
|
23天前
|
前端开发 搜索推荐 JavaScript
Web前端网站(四)- 音乐播放器
【8月更文挑战第9天】页面整体色调背景采用柔和渐变的方式呈现,与主页面的“毒药水式”色彩搭配形成了强烈的对比;周边花瓣缓缓飘落到水面之上形成涟漪。整体给人一种温馨、浪漫的感觉,还可以通过中间的3个按钮来控制音乐的切换和播放效果。每一行代码都有详细注释~~~大家可以尽情创作
20 2
Web前端网站(四)- 音乐播放器
|
11天前
|
SQL 监控 安全
|
15天前
|
JSON 前端开发 JavaScript
Web中的客户端和服务器端
Web中的客户端和服务器端
|
22天前
|
前端开发 网络协议 物联网
Django Web:搭建Websocket服务器(入门篇)
Django Web:搭建Websocket服务器(入门篇)
31 1
|
1天前
|
JavaScript 前端开发 UED
服务器端渲染新浪潮:用Vue.js和Nuxt.js构建高性能Web应用
【8月更文挑战第30天】在现代Web开发中,提升应用性能和SEO友好性是前端开发者面临的挑战。服务器端渲染(SSR)能加快页面加载速度并改善搜索引擎优化。Vue.js结合Nuxt.js提供了一个高效框架来创建SSR应用。通过安装`create-nuxt-app`,可以轻松创建新的Nuxt.js项目,并利用其自动路由功能简化页面管理。Nuxt.js默认采用SSR模式,并支持通过`asyncData`方法预取数据,同时提供了静态站点生成和服务器端渲染的部署选项,显著提升用户体验。
下一篇
云函数