副问题[/!--empirenews.page--]
什么是不安详的重定向?
对付任何web开拓职员来说,不安详或未履历证的重定向都是重要的安详思量身分。Express为重定向提供了当地支持,使它们易于实现和行使。然而,Express将执行输入验证的事变留给了开拓职员。Express是一种保持最低水平手限的机动Node.js Web应用措施框架,为Web和移动应用措施提供一组强盛的成果。
下面是OWASP.org网站给出的“未履历证的重定向和转发”的界说:
重定向凡是在登录和身份验证进程中行使,因此可以在登录之前将用户重定向到他们地址的页面。但按照营业需求或应用措施范例而有所差异,也存在其他重定向环境。
为什么要停止重定向?
不验证用户输入的重定向,可以使进攻者具备提倡收集垂纶诈骗的前提,从而窃取用户根据并执行其他恶意操纵。
留意:当在Node.js或Express中实现重定向时,在处事器端执行输入验证很重要。
假如进攻者发明用户没有验证外部用户提供的输入,他们也许会操作这个裂痕在论坛、交际媒体和其他民众场合宣布专门计划的链接,让用户点击它。
从外貌上看,这些URL看起来正当且对用户来说并无威胁,这是由于全部这些要重定向的URL都包括方针的主机名:
https://example.com/login?url=http://examp1e.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', function (req, res, next) {
-
- if(req.session.isAuthenticated()) {
-
- res.redirect(req.query.url);
- }
- });
-
- app.get('/account', function (req, res, next) {
- res.send('Account page');
- });
-
- app.get('/profile', function (req, res, next) {
- res.send('Profile page');
- });
-
- app.listen(port, function() {
- console.log('Server listening on port ' + port);
- });
输入验证有助于防备不安详的重定向
凡是,最好停止在代码中行使重定向和转发。假如你必然必要在代码中行使重定向,则首选的要领是行使映射到特定方针的预界说输入,这被称为白名单要领。以下就是实现这种要领的一个详细样本步调:
- baseHostname会确保任何重定向都将用户保存在研究职员的主机上;
- redirectMapping是一个工具,它将预界说的输入(譬喻,转达给url paramer的内容)映射随处事器上的特定路径;
- validateRedirect()要了解判定预界说的输入是否存在,假如它们存在,则返回要重定向的恰当路径;
- 研究职员修改了/login逻辑,然后将baseHostname+redirectPath变量毗连在一路,这就停止了任何用户提供的输入内容直接转达到Express res.redirect()要领中;
- 最后,研究职员行使encodeURI()要领作为特另外安详担保,确保毗连字符串的URI部门被正确编码,以应承干净的重定向。
- //Configure your whitelist
- var baseHostname = "https://example.com";
- var redirectMapping = {
- 'account': '/account',
- 'profile': '/profile'
- }
-
- //Create a function to validate whitelist
- function validateRedirect(key) {
- if(key in redirectMapping) {
-
- return redirectMapping[key];
- }else{
-
- return false;
- }
- }
-
- app.get('/login', function (req, res, next) {
- if(req.session.isAuthenticated()) {
- redirectPath = validateRedirect(req.query.url);
-
- if(redirectPath) {
- res.redirect(encodeURI(baseHostname + redirectPath));
- }else{
- res.send('Not a valid redirect!');
- }
- }
- });
其他重定向场景
(编辑:河北网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|