手机版

如何防御Node.js中的不安全跳转

时间:2021-08-29 来源:互联网 编辑:宝哥软件园 浏览:

线索:

早年浏览器大战时,有远见的Chrome认为要运行现代Web应用,浏览器必须有一个性能非常强大的Java引擎,于是谷歌开发了一个名为V8的高性能开源Java引擎。2009年,Ryan正式推出了基于Java语言和V8引擎的开源Web服务器项目,名为Node.js

不安全或未经身份验证的重定向对于任何web开发人员来说都是一个重要的安全考虑因素。Express为重定向提供本地支持,使它们易于实现和使用。Express是一个灵活的Node.js Web应用框架,它保持了最小的规模,提供了一组强大的Web和移动应用

什么是不安全重定向?

不安全或未经身份验证的重定向对于任何web开发人员来说都是一个重要的安全考虑因素。Express为重定向提供本地支持,使它们易于实现和使用。但是,Express将执行输入验证的工作留给了开发人员。Express是一个灵活的Node.js Web应用框架,保持了最小的规模,为Web和移动应用提供了一套强大的功能。

以下是OWASP.org网站:给出的“未经认证的重定向和转发”的定义

如果网络应用程序接受不可信输入,这可能导致网络应用程序将请求重定向到不可信输入中包含的网址,则可以执行未经身份验证的重定向和转发。

重定向通常在登录和身份验证期间使用,因此用户可以在登录前被重定向到他们的页面。但是,根据业务需求或应用程序类型,还有其他重定向情况。

为什么要避免重定向?

不验证用户输入的重定向,攻击者就有资格发起网络钓鱼诈骗,从而窃取用户凭据并执行其他恶意操作。

注意:在Node.js或Express中实现重定向时,在服务器端执行输入验证非常重要。

如果攻击者发现用户没有验证外部用户提供的输入,他们可能会利用此漏洞在论坛、社交媒体等公共场所发布专门设计的链接,供用户点击。

从表面上看,这些网址看起来是合法的,不会对用户构成威胁,因为所有这些要重定向的网址都包含目标的主机名:

https://example.com/login?URL=http://exam p1e.com/bad/things

但是,如果服务器端重定向逻辑无法验证输入url参数的数据,用户最终可能会访问黑客预先设置的网站(examp1e.com),以满足攻击的需要!以上只是攻击者如何利用不安全重定向逻辑的一个例子。

不安全的重定向示例,并将其直接传递给Express res.redirect()方法。因此,只要用户通过身份验证,Express就会将用户重定向到输入或提供的URL。

var express=require(' express ');var port=process . env . port | | 3000;var app=express();app.get('/login ',函数(req,res,next){ if(req . session . isauthenticated()){ RES . redirect(req . query . URL);}});app.get('/account ',函数(req,res,next){ RES . send(' Account page ');});app.get('/profile ',函数(req,res,next){ RES . send(' Profile page ');});app.listen(端口,函数(){ console.log('服务器侦听端口'端口);});输入验证有助于防止不安全的重定向

一般来说,最好避免在代码中使用重定向和转发。如果必须在代码中使用重定向,首选方法是使用映射到特定目标的预定义输入,这称为白名单方法。以下是实现该方法的具体示例步骤:

1.baseHostname确保任何重定向都将用户保留在研究人员的主机上;

2.redirectMapping是一个将预定义的输入(例如,传递给url参数的内容)映射到服务器上特定路径的对象;

3.3.validateRedirect()方法将确定预定义的输入是否存在,如果存在,返回适当的路径进行重定向;

4.研究人员修改了/login的逻辑,然后连接了baseHostname redirectPath的变量,防止用户提供的任何输入直接传输到Express res.redirect()方法。

5.最后,研究人员使用encodeURI()方法作为额外的安全保证,以确保连接字符串的URI部分被正确编码,从而允许干净的重定向。

//配置您的白名单base hostname=' https://example.com ';var redirectMapping={ ' account ' : '/account ',' profile ' : '/profile ' }//创建一个函数来验证白名单函数validateRedirect(key){ if(redirectMapping中的key){ return redirectMapping[key];} else { return false}}app.get('/login ',函数(req,res,next){ if(req . session . isauthenticated()){ redirectPath=validateRedirect(req . query . URL);if(redirectPath){ RES . redirect(encodeURI(base hostname redirectPath));}else{ res.send('不是有效的重定向!');} }});其他重定向场景

在某些情况下,将每个组合列入白名单是不切实际的,但是一些安全平台仍然希望重定向用户,并将他们保持在域的特定边界内。当外部提供的值遵循特定的模式(如16个字符的字母数字字符串)时,最好这样做。字母数字字符串是理想的,因为它们不包含任何可能引入其他攻击的特殊字符,如目录/路径遍历(取决于字符,如…和反斜杠/正斜杠)。

例如,安全平台可能希望在登录后将用户重定向回电子商务网站上的特定产品。由于电子商务网站对每个产品都有唯一的字母数字值,因此安全平台可以通过始终根据RegEx白名单验证外部输入来实现安全重定向。在本文提到的示例中,研究人员使用了productId变量。

//配置您的白名单base hostname=' https://example.com ';app.get('/login ',函数(req,res,next){ ProductID=(req . query . ProductID | | ' ');白名单=/^[a-za-z0-9]{16}$/;if(productId){//验证ProductID是字母数字,并且正好是16个字符if(白名单正则表达式. test(ProductID)){ RES . redirect(encodeURI(base hostname/' item/' ProductID));} else {//产品标识不符合正则表达式白名单,因此返回错误res.send('无效产品标识');} } else {//未提供productId,因此重定向到主页RES . redirect('/');}});最后,安全平台警告用户正在被自动重定向,值得关注。如果安全平台有意将用户重定向到域外,则可能需要在此过程中创建一个中间页面,该页面将发出以下警告,并包含用户将被重定向到的URL。

注:本文以海尔斯通为例。Hailstone是一个应用安全平台,具有发现代码中漏洞的功能。

本文翻译自:https://blog . hailstone . io/如何防止节点中不安全重定向-js

摘要

以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。

版权声明:如何防御Node.js中的不安全跳转是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。