Tag: 安全

是防止在nodejs安全的开放redirect攻击?

我试图阻止打开redirect攻击。 请看下面的代码并检查安全性: 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); }); 防止打开redirect攻击是否足够?还是应该添加其他内容?

使用Node和Express JS预防蛮力

我正在使用Node和Express JSbuild立一个网站,并想扼杀无效的login尝试。 既防止在线破解,又减less不必要的数据库调用。 我可以通过哪些方式来实现?

使用NodeJS服务器devise移动身份validation

我最近在为一个iOS应用程序的安全和用户身份validation问题挣扎,主要的问题是如何让用户注册任何第三方服务(或本地用户帐户),仍然保持安全和模块化的过程。 我提出的解决scheme是相当复杂的,我不是100%确定,如果所有这一切都是最佳实践,所以我想我会问,并得到什么build议和指针我可以修复,什么效果好,什么是坏等。 首先是authentication的问题。 我喜欢将authentication的想法与用户的想法分开。 对我来说,身份validation是由设备或客户端执行的,与特定用户无关,而用户帐户是由于身份validation而创build或检索的。 你可以做的是将客户端的身份validation视为一个进程,然后对用户进行身份validation(检查是否存在帐户等),以便有两层安全性。 假设客户端成功authentication,但用户密码错误,整体authentication失败,松散耦合这两个概念是有利的。 为了实现身份validation,我使用了JWT(JSON Web Tokens)通过cookie,原因很多。 1)它们在移动设备上工作得更好2)无会话,这使得服务器的实现变得更容易,并且据我所知,不受CORS攻击。 JWT似乎是使用移动设备时更好的解决scheme。 我使用了大量的npm库,最值得注意的是express-jwt和jsonwebtoken在服务器端进行身份validation。 正如我上面提到的,我不仅要执行身份validation,还希望允许用户注册任何他们想要的第三方服务,例如Facebook,Twitter,以减less注册期间的用户摩擦。 在思考这个问题之后,我花了很长时间search,提出了一个身份authentication系统的概念,authentication系统中的每个“账户types”被视为一个单独的身份提供者,并被推广为提供诸如access_token ,user_id,到期数据等。身份提供者很像在许多应用程序设置页面中看到的“已关联的帐户”。 在iOS的一面,我做了一个抽象类,为了支持每个服务,我创build了一个具体的子类, FacebookIdentityProvider , LocalIdentityProvider (email / password)等等。 在服务器端,我使用Passport模块来备份每种身份提供者。 例如,他们有一个facebook令牌模块,一个用户的电子邮件和密码等。所以我做了一个API路由/authenticate ,我的客户向序列化的身份提供商请求,并基于标识符string, local , facebook-token ,护照会根据提供的信息调用相应的子模块来validation该提供者。 总的来说,安全stream程如下所示: 客户端检查磁盘是否存在以前的JWT令牌(使用encryption箱进行安全存储)。 如果find令牌,客户端向我的verify端点发出请求。 该端点将validation令牌是否仍然有效并且没有过期。 如果令牌没有过期,客户端将被发送一个200,并与世界一切好。 如果不是,那么客户端将向我的refresh_token端点发出一个请求,其中包含已过期的令牌,它将尝试重新发送令牌。 如果失败,则客户端向我的authenticate端点发出请求,该端点只能由用户操作调用。 如果在磁盘上最初没有发现令牌,则在3的末尾发生同样的事情,客户端必须等待用户进行authentication。 所有这些工作都已经完成并且实现了,但是我仍然对一些事情有些模糊。 首先,我在express-jwt页面上读取了关于撤销令牌的内容。 什么决定了什么时候我应该撤销令牌并重新login用户? 每当它无限期地到期时,保持刷新令牌是没有意义的。 其次,当我将序列化身份提供者发送到服务器时,我传递一个额外信息的字典,这个信息将被护照用来根据进程进行身份validation。 如果成功,则为该用户创build身份提供者并存储在数据库中。 这是足够的,还是应该做更多的access_token和其他领域,我从一个成功的电话回来? 特别是对于Facebook SDK,当客户端通过应用程序进行身份validation时,我获得访问令牌,然后在客户端再次与服务器进行身份validation时,获得另一个令牌。 我有一个额外的想法是有人集成了每个请求通过头或查询parameter passing一个API密钥。 API密钥将被保密,并在客户端得到保护。 我认为这会做的是添加另一层“身份validation”,甚至还没有通过身份validation过程的客户端。 只有拥有api-key的客户才能够首先达到我的api,而且只有这些客户才能够进行身份validation。 我的背景是正式的networking安全(我从来没有任何好处),现在是全栈式移动开发,所以我对这个东西有更好的把握,但是我觉得好像在缺乏一些潜在的危险漏洞。 我不幸的是不能发布代码,因为这是我的业务,​​但如果有什么我不明确,只是评论,我会很乐意详细说明。 另外我觉得我应该提到,所有这些都是通过使用Nginxconfiguration的SSL完成的,并且我所有的iOSnetworking请求都是使用Overcoat进行的 […]

在NodeJS后端使用JWT和Active Directoryauthentication

我正在构build一个由Angular前端和Node.JS后端组成的Intranet Web应用程序。 应用程序需要使用企业Active Directory进行身份validation和授权。 我正在考虑如何以一种安全的方式最好地实现这一点。 我计划使用Active Directory节点模块实际与AD通信,以便在用户login时进行身份validation,并检查某些受限操作的安全组成员身份等。 但是,我不太确定授权我的后端端点的最佳方式是什么。 AD模块不提供任何令牌/票证,即使我假设Kerberos用于实际的身份validation过程。 在我开发的其他已validation的应用程序中,当用户login时,我生成了一个jsonwebtoken,然后在每个后端path中传递并validation该标记,在对AD进行身份validation时也是一个好主意? 编辑:问题的第二部分催生单独的线程: JWT令牌的服务器端处理的最佳做法 另外,对于实际validation令牌的最佳实践,我有一个更为普遍的关注。 假设用于JWT生成的“秘密”被破坏(在我的场景中,许多人可能有权访问系统的源代码,但不能访问系统本身)。 我是否相信恶意用户可以只用这些信息代表任何给定的用户生成一个令牌,而不用ADvalidation在我的API请求中使用该令牌? 令牌通常使用jwt.sign(payload, secretOrPrivateKey, options)生成jwt.sign(payload, secretOrPrivateKey, options) 。 或者,假设恶意用户可以获得一个实际的令牌(在过期之前)。 对我来说,似乎不必知道用户的用户名和密码,现在安全性已经降低到必须知道用户名和JWT秘密。 这是一个有效的关注,我该怎么做才能防止这种情况? 到目前为止,我最大的希望是使用服务器端会话login后存储有关当前用户的信息,以便即使在访问后端端点时恶意生成并使用令牌,除非用户实际已经通过login路由,通过ADauthentication,并在会话中存储一些信息。 我还考虑过在每个 API端点中实际使用AD进行身份validation,但这需要在每个请求中发送AD用户名/密码,这又要求敏感信息必须存储在客户端的sessionstorage或localstorage中,最有可能是一个坏主意。 所以,问题: 1)将AD授权与JWT结合为不记名令牌是合理的,还是使用AD进行authenticationbuild立安全后端+前端的首选方式是什么? 2)如果JWT是一个好主意,那么使用JWT保护端点的最佳做法是什么? 使用服务器端会话是否合理? 有趣的是,我已经发现了很多关于如何最好地实现基于令牌的authentication的例子(一般来说,或者特别是用NodeJS),但是其中有许多似乎有这样或那样的缺陷。

为什么Express / Connect为每个请求生成新的CSRF令牌?

据我所知,有两种方法可以防止CSRF攻击:1) 每个会话令牌 ,2) 每个请求令牌 1)在第一种情况下,当用户会话初始化时,CSRF令牌只生成一次。 所以一次只有一个用户有效的令牌。 2)在第二种情况下,每个请求都会生成一个新的CSRF令牌,之后一个旧的无效。 由于攻击者窃取令牌(通过XSS) ,当用户转到下一页时,就会过期,从而使得难度更大。 但另一方面,这种方法使webapp不太可用。 这里有一个很好的来自security.stackexchange.com的引用: 例如,如果他们点击“后退”button,并提交新的值的forms,提交将失败,并可能用一些敌对的错误信息迎接他们。 如果他们尝试在第二个选项卡中打开资源,他们会发现会话在一个或两个选项卡中随机分配 在分析Node.js Express框架(基于Connect )的时候,我发现每个请求都会生成一个新的CSRF标记, 但是旧的标记不会失效 。 我的问题是 :为什么要在每个请求中提供新的CSRF标记,而不是使旧的无效? 为什么不只是每个会话生成一个令牌? 谢谢你,对不起我的英文!

Node.js:挂钩repl到远程节点服务器

假设我有一个在mysite.com上运行的节点服务器。 有没有办法设置该服务器,以便我可以使用节点的repl API从我的本地机器安全地连接到它?

我应该使用什么express.cookieParser()秘密?

文档说它应该是保密的,但是我的代码在github上发布。 app.use(express.cookieParser(crypto.randomBytes(64).toString()))工作,或者应该在服务器重新启动时保密? 我应该把密码存储在磁盘上吗? 它需要多大的秘密?

安全的Node.js聊天(避免XSS)

我正在与Node.js和socket.iobuild立一个简单的小聊天 当用户键入他的消息时,它被广播给所有其他用户。 服务器发送消息: io.sockets.emit('fromServerToClient', { "message": message }); 客户端显示它: socket.on('fromServerToClient', function (data) { $('#messages').append(data.message + '<br />'); }); 但是当你发送像<script>alert(1);</script> ,它会在每个客户端浏览器上执行。 这是一个严重的安全缺陷,我想尽可能避免它。 我看到有人逃跑,但是我不认为这是足够的! 我怎么能100%确定我的聊天没有XSS漏洞? 顺便说一下,我总是指定字符集以避免UTF-7攻击。 谢谢你的帮助。

安全比较和简单==(=)之间的区别是什么

Github的安全webhooks页面说: 不build议使用普通的==运算符。 像secure_compare这样的方法执行“恒定时间”的string比较,这使得它可以安全地抵御常规等式运算符的某些定时攻击。 比较密码时bcrypt.compare('string', 'computed hash')我使用bcrypt.compare('string', 'computed hash') 。 是什么让这个“安全的比较”,我可以使用Node中的标准crypto库吗?

Node.js&Socket.io:一个安全websocket连接的自签名证书

我一直在互联网上寻找一个简单的答案,但大多数解决scheme涉及到使用快递和服务HTTP内容的安全连接。 我对Node.js和socket.io的安全web套接字连接( wss )更感兴趣 我不使用Node.js来处理HTTP请求。 我使用与Node.js一起使用的socket.io模块来实时向我的应用程序传递消息。 我只使用节点的networking套接字连接。 我会解释我的设置是什么。 我使用Django作为我的HTTP后端。 用户向Django发出请求,Django将该请求的内容转发给Redis,Node.js在Redis的某个频道上侦听,处理内容并将消息发送给相应的收件人。 非常简单直接。 一切工作正常。 但是,我担心与Node.js的websocket连接是不安全的。 当Node.js向收件人发送消息时,我不希望任何人在两者之间窥探并拦截消息。 我想确保我的用户感到安全,并相信我为他们build立的服务。 我查看了来自CA的自签名证书和证书。 两者都提供相同的安全级别。 由于我只使用Node.js作为socket.io而不提供HTTP内容,所以自签名证书将工作得非常好(我build立的服务是针对移动的,而不是针对浏览器的)。 以下是我的socket.io的实现: var io = require('socket.io').listen(8000); var redis = require('socket.io/node_modules/redis') var redisChannelConnection = redis.createClient(6000, "12.345.678.9"); var redisServer = redis.createClient(6000, "23.456.789.1"); // Subscribe to Redis Channel redisChannelConnection.subscribe('messages'); io.sockets.on('connection', function (socket) { socket.emit('message', 'Hello World'); } 到目前为止,我已经写了一个简单的连接函数。 它作为一个正常的websocket连接。 但是我想使它成为一个安全的websocket连接 。 […]