Skip to content

Commit 1deb81f

Browse files
committed
vulnerability fixes
1 parent 10142cc commit 1deb81f

File tree

2 files changed

+30
-7
lines changed

2 files changed

+30
-7
lines changed

Parse-Dashboard/Authentication.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,22 @@ function initialize(app, options) {
7676
csrf(),
7777
(req,res,next) => {
7878
let redirect = 'apps';
79+
let originalRedirect = null;
7980
if (req.body.redirect) {
80-
// Strip leading slash from redirect to prevent double slashes
81-
redirect = req.body.redirect.charAt(0) === '/' ? req.body.redirect.substring(1) : req.body.redirect
81+
originalRedirect = req.body.redirect;
82+
// Validate redirect to prevent open redirect vulnerability
83+
if (originalRedirect.includes('://') || originalRedirect.startsWith('//')) {
84+
// Reject absolute URLs and protocol-relative URLs
85+
redirect = 'apps';
86+
originalRedirect = null;
87+
} else {
88+
// Strip leading slash from redirect to prevent double slashes
89+
redirect = originalRedirect.charAt(0) === '/' ? originalRedirect.substring(1) : originalRedirect;
90+
}
8291
}
8392
return passport.authenticate('local', {
8493
successRedirect: `${self.mountPath}${redirect}`,
85-
failureRedirect: `${self.mountPath}login${req.body.redirect ? `?redirect=${req.body.redirect}` : ''}`,
94+
failureRedirect: `${self.mountPath}login${originalRedirect ? `?redirect=${originalRedirect}` : ''}`,
8695
failureFlash : true
8796
})(req, res, next)
8897
},

Parse-Dashboard/app.js

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1062,11 +1062,25 @@ You have direct access to the Parse database through function calls, so you can
10621062
}
10631063

10641064
app.get('/login', csrf(), function(req, res) {
1065-
let redirectURL = req.url.includes('?redirect=') && req.url.split('?redirect=')[1].length > 1 && req.url.split('?redirect=')[1];
1065+
let redirectURL = null;
1066+
try {
1067+
const url = new URL(req.url, 'http://localhost');
1068+
redirectURL = url.searchParams.get('redirect');
1069+
} catch (error) {
1070+
console.warn('Invalid URL in login redirect:', error.message);
1071+
}
10661072
if (!users || (req.user && req.user.isAuthenticated)) {
1067-
// Strip leading slash from redirect to prevent double slashes or malformed URLs
1068-
if (redirectURL && redirectURL.charAt(0) === '/') {
1069-
redirectURL = redirectURL.substring(1);
1073+
// Validate and sanitize redirect URL to prevent open redirect vulnerability
1074+
if (redirectURL) {
1075+
// Reject absolute URLs and protocol-relative URLs
1076+
if (redirectURL.includes('://') || redirectURL.startsWith('//')) {
1077+
redirectURL = null;
1078+
} else {
1079+
// Strip leading slash to prevent double slashes
1080+
if (redirectURL.charAt(0) === '/') {
1081+
redirectURL = redirectURL.substring(1);
1082+
}
1083+
}
10701084
}
10711085
return res.redirect(`${mountPath}${redirectURL || 'apps'}`);
10721086
}

0 commit comments

Comments
 (0)