Skip to content

Commit 8736413

Browse files
author
Max Schaefer
committed
Use more sensible validator in example.
1 parent 7823ff9 commit 8736413

File tree

7 files changed

+25
-25
lines changed

7 files changed

+25
-25
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const app = require("express")();
22

3-
app.get('/redirect', function(req, res) {
3+
app.get("/redirect", function (req, res) {
44
// BAD: a request parameter is incorporated without validation into a URL redirect
5-
res.redirect(req.params["target"]);
5+
res.redirect(req.query["target"]);
66
});

javascript/ql/src/Security/CWE-601/examples/ServerSideUrlRedirectGood.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ const app = require("express")();
22

33
const VALID_REDIRECT = "http://cwe.mitre.org/data/definitions/601.html";
44

5-
app.get('/redirect', function(req, res) {
5+
app.get("/redirect", function (req, res) {
66
// GOOD: the request parameter is validated against a known fixed string
7-
let target = req.params["target"]
7+
let target = req.query["target"];
88
if (VALID_REDIRECT === target) {
99
res.redirect(target);
1010
} else {
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
const app = require("express")();
22

3-
function isLocalUrl(url) {
4-
return url.startsWith("/") && !url.startsWith("//") && !url.startsWith("/\\");
3+
function isRelativePath(path) {
4+
return !/^(\w+:)?[/\\]{2}/.test(path);
55
}
66

7-
app.get('/redirect', function(req, res) {
7+
app.get("/redirect", function (req, res) {
88
// GOOD: check that we don't redirect to a different host
9-
let target = req.params["target"];
10-
if (isLocalUrl(target)) {
9+
let target = req.query["target"];
10+
if (isRelativePath(target)) {
1111
res.redirect(target);
1212
} else {
1313
res.redirect("/");
1414
}
15-
});
15+
});

javascript/ql/test/query-tests/Security/CWE-601/ServerSideUrlRedirect/ServerSideUrlRedirect.expected

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
nodes
2-
| ServerSideUrlRedirect.js:5:16:5:35 | req.params["target"] |
3-
| ServerSideUrlRedirect.js:5:16:5:35 | req.params["target"] |
4-
| ServerSideUrlRedirect.js:5:16:5:35 | req.params["target"] |
2+
| ServerSideUrlRedirect.js:5:16:5:34 | req.query["target"] |
3+
| ServerSideUrlRedirect.js:5:16:5:34 | req.query["target"] |
4+
| ServerSideUrlRedirect.js:5:16:5:34 | req.query["target"] |
55
| express.js:7:16:7:34 | req.param("target") |
66
| express.js:7:16:7:34 | req.param("target") |
77
| express.js:7:16:7:34 | req.param("target") |
@@ -117,7 +117,7 @@ nodes
117117
| react-native.js:9:26:9:32 | tainted |
118118
| react-native.js:9:26:9:32 | tainted |
119119
edges
120-
| ServerSideUrlRedirect.js:5:16:5:35 | req.params["target"] | ServerSideUrlRedirect.js:5:16:5:35 | req.params["target"] |
120+
| ServerSideUrlRedirect.js:5:16:5:34 | req.query["target"] | ServerSideUrlRedirect.js:5:16:5:34 | req.query["target"] |
121121
| express.js:7:16:7:34 | req.param("target") | express.js:7:16:7:34 | req.param("target") |
122122
| express.js:12:26:12:44 | req.param("target") | express.js:12:26:12:44 | req.param("target") |
123123
| express.js:27:7:27:34 | target | express.js:33:18:33:23 | target |
@@ -215,7 +215,7 @@ edges
215215
| react-native.js:7:17:7:33 | req.param("code") | react-native.js:7:7:7:33 | tainted |
216216
| react-native.js:7:17:7:33 | req.param("code") | react-native.js:7:7:7:33 | tainted |
217217
#select
218-
| ServerSideUrlRedirect.js:5:16:5:35 | req.params["target"] | ServerSideUrlRedirect.js:5:16:5:35 | req.params["target"] | ServerSideUrlRedirect.js:5:16:5:35 | req.params["target"] | Untrusted URL redirection depends on a $@. | ServerSideUrlRedirect.js:5:16:5:35 | req.params["target"] | user-provided value |
218+
| ServerSideUrlRedirect.js:5:16:5:34 | req.query["target"] | ServerSideUrlRedirect.js:5:16:5:34 | req.query["target"] | ServerSideUrlRedirect.js:5:16:5:34 | req.query["target"] | Untrusted URL redirection depends on a $@. | ServerSideUrlRedirect.js:5:16:5:34 | req.query["target"] | user-provided value |
219219
| express.js:7:16:7:34 | req.param("target") | express.js:7:16:7:34 | req.param("target") | express.js:7:16:7:34 | req.param("target") | Untrusted URL redirection depends on a $@. | express.js:7:16:7:34 | req.param("target") | user-provided value |
220220
| express.js:12:26:12:44 | req.param("target") | express.js:12:26:12:44 | req.param("target") | express.js:12:26:12:44 | req.param("target") | Untrusted URL redirection depends on a $@. | express.js:12:26:12:44 | req.param("target") | user-provided value |
221221
| express.js:33:18:33:23 | target | express.js:27:16:27:34 | req.param("target") | express.js:33:18:33:23 | target | Untrusted URL redirection depends on a $@. | express.js:27:16:27:34 | req.param("target") | user-provided value |
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const app = require("express")();
22

3-
app.get('/redirect', function(req, res) {
3+
app.get("/redirect", function (req, res) {
44
// BAD: a request parameter is incorporated without validation into a URL redirect
5-
res.redirect(req.params["target"]);
5+
res.redirect(req.query["target"]);
66
});

javascript/ql/test/query-tests/Security/CWE-601/ServerSideUrlRedirect/ServerSideUrlRedirectGood.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ const app = require("express")();
22

33
const VALID_REDIRECT = "http://cwe.mitre.org/data/definitions/601.html";
44

5-
app.get('/redirect', function(req, res) {
5+
app.get("/redirect", function (req, res) {
66
// GOOD: the request parameter is validated against a known fixed string
7-
let target = req.params["target"]
7+
let target = req.query["target"];
88
if (VALID_REDIRECT === target) {
99
res.redirect(target);
1010
} else {
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
const app = require("express")();
22

3-
function isLocalUrl(url) {
4-
return url.startsWith("/") && !url.startsWith("//") && !url.startsWith("/\\");
3+
function isRelativePath(path) {
4+
return !/^(\w+:)?[/\\]{2}/.test(path);
55
}
66

7-
app.get('/redirect', function(req, res) {
7+
app.get("/redirect", function (req, res) {
88
// GOOD: check that we don't redirect to a different host
9-
let target = req.params["target"];
10-
if (isLocalUrl(target)) {
9+
let target = req.query["target"];
10+
if (isRelativePath(target)) {
1111
res.redirect(target);
1212
} else {
1313
res.redirect("/");
1414
}
15-
});
15+
});

0 commit comments

Comments
 (0)