提高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中的内容相匹配

相关文章
|
存储 监控 安全
如何在Python Web开发中确保应用的安全性?
如何在Python Web开发中确保应用的安全性?
789 157
|
移动开发 数据挖掘 开发者
服务器发送事件(SSE)在现代Web开发中的关键作用
服务器发送事件(SSE)是HTML5标准协议,用于服务器主动向客户端推送实时数据,适合单向通信场景。相比WebSocket,SSE更简洁高效,基于HTTP协议,具备自动重连、事件驱动等特性。常见应用场景包括实时通知、新闻推送、数据分析等。通过Apipost等工具可轻松调试SSE,助力开发者构建高效实时Web应用。示例中,电商平台利用SSE实现秒杀活动通知,显著减少延迟并简化架构。掌握SSE技术,能大幅提升用户体验与开发效率。
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
526 3
|
Java PHP
PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。理解其垃圾回收机制有助于开发高效稳定的PHP应用。
【10月更文挑战第1天】PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。其垃圾回收机制包括引用计数与循环垃圾回收,对提升应用性能和稳定性至关重要。本文通过具体案例分析,详细探讨PHP垃圾回收机制的工作原理,特别是如何解决循环引用问题。在PHP 8中,垃圾回收机制得到进一步优化,提高了效率和准确性。理解这些机制有助于开发高效稳定的PHP应用。
329 3
|
JSON 算法 安全
Web安全-JWT认证机制安全性浅析
Web安全-JWT认证机制安全性浅析
683 3
|
存储 安全 算法
服务器数据恢复—Raid磁盘阵列的安全性分析及常见故障
出于尽可能避免数据灾难的设计初衷,RAID解决了3个问题:容量问题、IO性能问题、存储安全(冗余)问题。从数据恢复的角度讨论RAID的存储安全问题。 常见的起到存储安全作用的RAID方案有RAID1、RAID5及其变形。基本设计思路是相似的:当部分数据异常时,可通过特定算法将数据还原出来。以RAID5为例:如果要记录两个数字,可以通过再多记录这两个数字的和来达到记录冗余性的目的。例如记录3和5,同时再记录这2个数字的和8。在不记得到底是几和5的情况下,只需要用8-5就可以算出这个丢失的数字了,其余情况依此类推。
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
1559 1
|
Rust 安全 开发者
惊爆!Xamarin 携手机器学习,开启智能应用新纪元,个性化体验与跨平台优势完美融合大揭秘!
【8月更文挑战第31天】随着互联网的发展,Web应用对性能和安全性要求不断提高。Rust凭借卓越的性能、内存安全及丰富生态,成为构建高性能Web服务器的理想选择。本文通过一个简单示例,展示如何使用Rust和Actix-web框架搭建基本Web服务器,从创建项目到运行服务器全程指导,帮助读者领略Rust在Web后端开发中的强大能力。通过实践,读者可以体验到Rust在性能和安全性方面的优势,以及其在Web开发领域的巨大潜力。
328 0
|
弹性计算 运维 安全
阿里云轻量应用服务器与云服务器ECS啥区别?新手帮助教程
阿里云轻量应用服务器适合个人开发者搭建博客、测试环境等低流量场景,操作简单、成本低;ECS适用于企业级高负载业务,功能强大、灵活可扩展。二者在性能、网络、镜像及运维管理上差异显著,用户应根据实际需求选择。
1024 10
|
弹性计算 ice
阿里云4核8g服务器多少钱一年?1个月和1小时价格,省钱购买方法分享
阿里云4核8G服务器价格因实例类型而异,经济型e实例约159元/月,计算型c9i约371元/月,按小时计费最低0.45元。实际购买享折扣,1年最高可省至1578元,附主流ECS实例及CPU型号参考。
999 8