在 Nodejs 中防止开放重定向攻击安全吗?

2024-01-06

我正在尝试防止开放重定向攻击。请查看下面的代码并检查安全性:

var = require('url');

// http://example.com/login?redirect=http://example.com/dashboard
app.route('/login', function (req, res, next) {
   var redirect = req.query.redirect,
        paths = url.parse(redirect); 

   if (paths.host !== req.headers.host) {
      return next(new Error('Open redirect attack detected'));
   }

   return res.redirect(redirect);
});

这足以防止开放重定向攻击还是应该添加其他内容?


CWE-601:URL 重定向到不受信任的站点(“开放重定向”) https://cwe.mitre.org/data/definitions/601.html

描述Open Redirect:

http 参数可能包含 URL 值,并可能导致 Web 应用程序将请求重定向到指定的 URL。通过修改恶意站点的 URL 值,攻击者可能会成功发起网络钓鱼诈骗并窃取用户凭据。由于修改后的链接中的服务器名称与原始站点相同,因此网络钓鱼尝试看起来更值得信赖。

的建议input validation防止开放重定向攻击的策略:

假设所有输入都是恶意的。使用“接受已知良好”的输入验证策略,即使用严格符合规范的可接受输入白名单。拒绝任何不严格符合规范的输入,或将其转换为严格符合规范的内容。 不要仅依赖于查找恶意或格式错误的输入(即不要依赖黑名单)。黑名单可能会错过至少一个不需要的输入,尤其是在代码环境发生变化的情况下。这可以为攻击者提供足够的空间来绕过预期的验证。然而,黑名单对于检测潜在的攻击或确定哪些输入格式错误以至于应该被彻底拒绝非常有用。 使用已批准的 URL 或域的白名单来进行重定向。

Use req.headers.host, req.host or req.hostname是不安全的,因为req.headers可以伪造(例如,HTTP 请求有一个自定义的Host用于访问用下面的代码编写的 Express 应用程序的标头)

var url = require('url');

app.get('/login', function (req, res, next) {
    var redirect = req.query.redirect,
        targetUrl = url.parse(redirect);
    console.log('req.headers.host: [%s]', req.headers.host);
    console.log('req.host: [%s]', req.host);
    console.log('req.hostname: [%s]', req.hostname);
    if (targetUrl.host != req.headers.host) {
        return next(new Error('Open redirect attack detected'));
    }
    return res.redirect(redirect);
});

Use curl提出请求:

$ curl -H 'Host: malicious.example.com' 'http://localhost:3012/login?redirect=http://malicious.example.com' -i
HTTP/1.1 302 Found
X-Powered-By: Express
Location: http://malicious.example.com
Vary: Accept
Content-Type: text/plain; charset=utf-8
Content-Length: 54
Date: Mon, 13 Jun 2016 06:30:55 GMT
Connection: keep-alive

$ #server output
req.headers.host: [malicious.example.com]
req.host: [malicious.example.com]
req.hostname: [malicious.example.com]

我建议您使用白名单来验证输入,示例代码如下:

const WHITELIST_TO_REDIRECT = new Set(["localhost:3012", "www.realdomain.com"]);

app.get('/login', function (req, res, next) {
   var redirect = req.query.redirect,
        targetUrl = url.parse(redirect);
   console.log("req.hostname: [%s]", req.hostname);
   console.log("url.host: [%s]", targetUrl.host);
   if (!WHITELIST_TO_REDIRECT.has(targetUrl.host)) {
      return next(new Error('Open redirect attack detected'));
   }

   return res.redirect(redirect);
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Nodejs 中防止开放重定向攻击安全吗? 的相关文章

  • 为什么 npm install 失败并出现与 node-sass 相关的错误?

    我正在使用我继承的 Rails 应用程序 我正在尝试运行npm install命令但我不断收到errors以下 我尝试跑步npm rebuild node sass正如输出中所建议的 但它没有帮助 我遇到这个问题乌班图16也OS X gt
  • 如何在 SailsJS 中选择性地包含 javascript 资源?

    在 Sails js 应用程序中 如何有选择地包含 javascript 资源 例如 如果我有一个管理页面 并且 admin js 位于 assets js 目录中 如何防止 admin js 在公共索引页上加载 我知道我可以将 js 移出
  • 如何使用PNGJS库从rgb矩阵创建png?

    我无法从此处的文档创建 PNG 文件 编码 https github com niegowski node pngjs https github com niegowski node pngjs 该文档提供了有关操作现有 PNG 的示例 为
  • 打开 Access 2007 文件

    我正在尝试打开受我们客户端保护的 Access 2007 文件 当我双击它时 它显示以下错误 错误 您没有使用该对象所需的权限 让您的系统管理员或创建此对象的人员为您建立适当的权限 错误3033 在我搜索此解决方案时 我了解到它受 Wind
  • 无法将环境变量传递给 docker

    我正在尝试使用环境变量运行 docker 映像 但它对我来说不起作用 无论是使用 env list 文件还是通过命令行 docker run p 49160 8080 d appname e FOO foo 来自守护程序的错误响应 OCI
  • express.js less 编译器:无法工作

    app js app use express compiler src dirname public enable less app use express static dirname public 在我的玉观中 link rel sty
  • 在数据库中存储用户电子邮件地址的最佳和最安全的方法是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 出于安全原因 在将用户电子邮件放入数据库之前是否值得对其进行加密 我知道我们对密码进行哈希和加盐 但那是另一个故事 因为我们并不真正需要密码原件
  • 在 es6 中使用 jsPDF 和 html2canvas

    我正在尝试将 jsPDF 和 html2canvas 与 es6 一起使用 我正在导入 html2canvas 和 jsPDF 但在 addHTML 上出现错误 当我注释掉 addHTML 时 会生成 pdf 有什么线索吗 Thanks j
  • 当我尝试连接本地主机时出现 ERR_SSL_PROTOCOL_ERROR

    我开始研究 Node js 并尝试将 ionic 应用程序与我创建的后端 NodeJS 应用程序连接 但出现此错误 OPTIONS https localhost 3000 插入 https localhost 3000 insert净 E
  • 将数据从 javascript/html 页面发送到 Express NodeJS 服务器

    我正在使用 html5 和 javascript 开发 cordova 应用程序 该架构如下 电话应用程序向服务器请求某些内容 服务器请求 firebird 数据库 数据库回答服务器 服务器将所请求的数据提供给电话应用程序 在 html5
  • mongoose node.js,使用 $lt 和 $gt 进行查询不起作用

    我想要获取最后分数在 15 到 20 之间的所有学生 为此 我使用 mongoose 在 mongoDB 中执行以下查询 模型工作正常 所有其他查询都正常 Pupils find marks 1 value lt 20 marks 1 va
  • npm 命令未在请求中发送授权令牌 - 无法进行身份验证

    当我发出 npm 命令时遇到此问题 我收到一条消息 指出它无法通过 npm 注册表 托管在 Azure DevOps 中 进行身份验证 我怀疑这可能是因为它没有生成授权标头并发送它连同请求 例如 当我发出这些命令时 npm ping or
  • 在原子操作中测试和递减?

    我刚刚发现了一个恼人的错误 它基本上是一个竞争条件 为了便于论证 我们假设一个非常简单的文档结构 例如 id XXX amount 100 集合中存在数百个这样的文档 并且由多个编写器访问 这些编写器有效地尝试将数量降低任何值 但绝不会低于
  • Yii2 DropDownList Onchange 更改自动完成小部件“源”属性?

    我已经尝试过这个 yii2 依赖的自动完成小部件 https stackoverflow com questions 27025791 yii2 dependent autocomplete widget 但我不知道为什么它不起作用 这是我
  • Nodejs 的简单 put 请求,无需 Express

    我需要能够将 zip 文件上传到 Brightsign 单元 并考虑创建一个 Rest api 我可以发出 put 请求来发送 zip 文件 但问题是我找到的所有例子都是使用express之类的框架 是否可以在不使用额外框架的情况下在 No
  • Node.js 连接 createServer 代码

    我正在阅读 Node js Connect 版本 2 15 0 Create a new connect server return Function api public function createServer function ap
  • 节点持久-NodeJS

    谁详细向我解释了如何操作以下说明 var storage require node persist var account username Morris password test storage initSync storage set
  • 如何在 ionic 应用程序中使用 socket.io

    我正在使用 ionic 创建一个应用程序cordova and angular 我必须使用 IP 地址和端口号发出请求 到插座 我读过有关 socket io 的内容 我对如何安装感到困惑套接字 io以及如何与 Angular JS 和 N
  • 如何在node.js中找到两个地理点之间的距离?

    如何使用 node js 查找两个地理点 经度和经度的集合 之间的距离 我有使用谷歌地图距离矩阵服务的客户端 JavaScript 代码 我想在服务器端javascript中做同样的事情 在node js router js或datamod
  • 如何删除 node_modules - Windows 中的深层嵌套文件夹

    尝试删除后节点模块创建的目录npm install 源文件名大于文件支持的名称 系统 尝试移动到路径名称较短的位置 或者尝试 在尝试此操作之前重命名为较短的名称 I also tried shift delete and still hav

随机推荐

  • Swagger Codegen basePath 被忽略

    我正在尝试使用生成一些网络服务定义Swagger 代码生成 2 2 1 所有配置都正常工作 并且我的类已正确生成 yaml定义 为何选择该物业basePath被忽视了 My RestController仅使用生成paths定义 https
  • 使用 Chart.js 根据时间字符串绘制单圈时间

    我正在尝试使用 Chart js 绘制一个折线图 显示一系列单圈时间的趋势 但我正在努力将时间字符串解析为正确的格式 我有一个带有这样的单圈持续时间 分钟 秒 毫秒 的时间数组 我将其用作数据集 const times 1 32 599 1
  • Target Boost:: 已导入位置 + 链接错误

    我正在使用 Homebrew 在 MacOS Mojave 上安装 LLVM Boost 和 CMake 将我的 LLVM 升级到版本 9 0 0 并将 Boost 升级到 1 71 0 后 CMake v3 15 3 开始抱怨各种库已经具
  • C++ 整数->std::字符串转换。功能简单?

    问题 我有一个整数 该整数需要转换为 stl string 类型 过去我用过stringstream进行转换 这有点麻烦 我知道 C 方法是做一个sprintf 但我更愿意做一个类型安全 呃 的 C 方法 有一个更好的方法吗 这是我过去使用
  • 使用并行集合就地转换数组

    当拥有一组对象时 通常需要 例如出于性能原因 更新 替换 某些对象 例如 如果您有一个整数数组 您可能希望将负整数替换为正整数 Faster for primitives var i 0 while i lt a length if a i
  • 将相等运算符与 boost::Optional 一起使用

    我试图为另一个命名空间中定义的类型 T 定义一个相等运算符 然后在optional
  • Asp.Net UpdatePanel错误

    我在我的 aspx 页面中使用 UpdatePanel 并使用 DropDownListonselectedindexchanged方法 第一次运行时onselectedindexchanged方法正在发挥作用 但是再次更改选择它会返回这样
  • 用于嵌入式 Tomcat 8.5 的 Tomcat Maven 插件

    我正在运行 Spring Web 应用程序 但无法使用 Tomcat 8 5 在最新的 Eclipse 中执行嵌入式 tomcatTomcat 7 Maven 插件 http tomcat apache org maven plugin t
  • ASP.Net Core:如何更新(更改/添加/删除)嵌套项对象(一对多关系)?

    我有一个带有 MSCustomers 和 MSLocations 的 Net 5 x 项目 MSLocations 与 MSCustomers 之间存在多对一的关系 我的 编辑 页面正确显示 MSCustomer 记录和相应的 MSLoca
  • 使用软键盘时不会调用 onKeyDown

    我的 Activity 的 xml 代码是
  • 如何使用 Mercurial 自动合并 2 个头

    我们刚刚从 subversion 切换到 Mercurial 有一件事比预期花费了更多的时间 合并头 我们喜欢这样一个事实 它使合并独立于 2 个提交 与 subversion 相比 但我们最终会定期合并 2 个头以进行不相关的更改 简单的
  • 隧道和冒泡事件何时在 WPF 中有用?

    我了解冒泡和隧道的工作原理 但是 我对使用它们感到困惑 原因如下 我想处理鼠标点击事件 要使其起泡 有MouseDown并且 为了隧道化 有PreviewMouseDown 然而 MouseDown并不一定意味着用户单击了该控件 可能是用户
  • 如何使用 Objective C iOS 删除 iPhone X 中表格视图顶部的多余空间

    我已经用 Objective C 开发了一个应用程序 它在所有 iPhone 手机上运行良好 但是当我在 iPhone X 模拟器中运行这个应用程序时 我不知道如何在 UITableView 的顶部获得一些额外的空间 大约 20 22 像素
  • 行高属性:正常+4px

    我想要normal行高加上 4px 我努力了 line height normal 4px 但这行不通 Note 我不想使用百分比进行近似 为什么不直接去掉 Chrome 的小焦点眩光呢 使用CSS属性outline none http j
  • 在管道中发送 EOF 而不关闭它

    我正在编写一个使用 GnuPlot 来绘制数据的应用程序 我决定使用 二进制 格式 而不是使用文本格式通过管道来通信两个程序 由于 vprintf 和传递的数据量很大 速度很慢 问题是 在二进制格式中 GnuPlot 期望 EOF Ctrl
  • Laravel 5.2:csrf 令牌不起作用

    您好 为什么我的 csrf 令牌值为 null 当我不使用令牌时 我没有 TokenMismatchException 我该如何解决它 我更深入地挖掘 发现会话没有在 SessionServiceProvider 中注册 是否需要启用某些功
  • 编写交叉兼容的 Python 2/3:__future__、6 和 future.utils 之间的区别?

    我正在编写交叉兼容的 Python 2 和 3 代码 并从中得到一些帮助备忘单 http python future org compatible idioms html 我注意到有不同的包和模块可以帮助做到这一点 future包 例如fu
  • SwiftUI 中模态表可以有导航栏吗?

    我在代码中通过导航栏按钮呈现模式表 struct MainPage View State var isModalSheetShown Bool false var body some View VStack navigationBarIte
  • 获取 StartDate 和 EndDate 之间的日期

    我有日期数组 我只需要获取两个不同日期 开始日期和结束日期 之间的日期 任何人都可以帮我解决这个问题吗 提前致谢 假设你有startDate and endDate类型的实例NSDate你可以 NSPredicate predicate N
  • 在 Nodejs 中防止开放重定向攻击安全吗?

    我正在尝试防止开放重定向攻击 请查看下面的代码并检查安全性 var require url http example com login redirect http example com dashboard app route login