Skip to content

Commit 42df579

Browse files
committed
Track Hapi request aliases before property reads
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8390a2d1-70e3-4a01-84d3-3e5747d5da0b
1 parent 0d642e5 commit 42df579

3 files changed

Lines changed: 21 additions & 7 deletions

File tree

javascript/ql/lib/semmle/javascript/frameworks/Hapi.qll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ module Hapi {
106106
RouteHandler rh, string property, DataFlow::TypeTracker t
107107
) {
108108
t.start() and
109-
result = rh.getRequestParameter().getAPropertyRead(property)
109+
result = rh.getARequestSource().ref().getAPropertyRead(property)
110110
or
111111
exists(DataFlow::TypeTracker t2 | result = requestInputRef(rh, property, t2).track(t2, t))
112112
}
@@ -132,15 +132,15 @@ module Hapi {
132132
// `request.payload` is an object, so prefer a property read if possible.
133133
if exists(requestInputRef(rh, "payload").getAPropertyRead())
134134
then this = requestInputRef(rh, "payload").getAPropertyRead()
135-
else this = rh.getRequestParameter().getAPropertyRead("payload")
135+
else this = rh.getARequestSource().ref().getAPropertyRead("payload")
136136
)
137137
or
138138
kind = "parameter" and
139139
exists(string property | property = ["query", "params"] |
140140
// These are objects, so prefer a property read if possible.
141141
if exists(requestInputRef(rh, property).getAPropertyRead())
142142
then this = requestInputRef(rh, property).getAPropertyRead()
143-
else this = rh.getRequestParameter().getAPropertyRead(property)
143+
else this = rh.getARequestSource().ref().getAPropertyRead(property)
144144
)
145145
or
146146
exists(DataFlow::PropRead url |

javascript/ql/test/library-tests/frameworks/hapi/src/hapi.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ server2.ext('onPreResponse', function handler3(request, reply) { // HTTP::RouteH
2020
function handler4(request, reply){
2121
request.rawPayload;
2222
request.payload.foo;
23-
request.query.bar;
23+
getRequest(request).query.bar;
2424
request.url.path;
2525
request.headers.baz;
2626
request.state.token;
@@ -34,3 +34,7 @@ function getHandler() {
3434
return function (req, h){}
3535
}
3636
server2.route({handler: getHandler()});
37+
38+
function getRequest(request) {
39+
return request;
40+
}

javascript/ql/test/library-tests/frameworks/hapi/tests.expected

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,16 @@ test_RequestExpr
2424
| src/hapi.js:20:19:20:25 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} |
2525
| src/hapi.js:21:3:21:9 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} |
2626
| src/hapi.js:22:3:22:9 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} |
27-
| src/hapi.js:23:3:23:9 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} |
27+
| src/hapi.js:23:3:23:21 | getRequest(request) | src/hapi.js:20:1:27:1 | functio ... oken;\\n} |
28+
| src/hapi.js:23:14:23:20 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} |
2829
| src/hapi.js:24:3:24:9 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} |
2930
| src/hapi.js:25:3:25:9 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} |
3031
| src/hapi.js:26:3:26:9 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} |
3132
| src/hapi.js:34:22:34:24 | req | src/hapi.js:34:12:34:30 | function (req, h){} |
33+
| src/hapi.js:38:1:40:1 | return of function getRequest | src/hapi.js:20:1:27:1 | functio ... oken;\\n} |
34+
| src/hapi.js:38:21:38:27 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} |
35+
| src/hapi.js:38:21:38:27 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} |
36+
| src/hapi.js:39:10:39:16 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} |
3237
| src/hapiglue.js:13:32:13:38 | request | src/hapiglue.js:13:14:15:5 | functio ... n\\n } |
3338
| src/hapiglue.js:13:32:13:38 | request | src/hapiglue.js:13:14:15:5 | functio ... n\\n } |
3439
| src/hapiglue.js:14:9:14:15 | request | src/hapiglue.js:13:14:15:5 | functio ... n\\n } |
@@ -102,7 +107,7 @@ test_ServerDefinition
102107
test_RequestInputAccess
103108
| src/hapi.js:21:3:21:20 | request.rawPayload | body | src/hapi.js:20:1:27:1 | functio ... oken;\\n} |
104109
| src/hapi.js:22:3:22:21 | request.payload.foo | body | src/hapi.js:20:1:27:1 | functio ... oken;\\n} |
105-
| src/hapi.js:23:3:23:19 | request.query.bar | parameter | src/hapi.js:20:1:27:1 | functio ... oken;\\n} |
110+
| src/hapi.js:23:3:23:31 | getRequ ... ery.bar | parameter | src/hapi.js:20:1:27:1 | functio ... oken;\\n} |
106111
| src/hapi.js:24:3:24:18 | request.url.path | url | src/hapi.js:20:1:27:1 | functio ... oken;\\n} |
107112
| src/hapi.js:25:3:25:21 | request.headers.baz | header | src/hapi.js:20:1:27:1 | functio ... oken;\\n} |
108113
| src/hapi.js:26:3:26:21 | request.state.token | cookie | src/hapi.js:20:1:27:1 | functio ... oken;\\n} |
@@ -174,10 +179,15 @@ test_RouteHandler_getARequestExpr
174179
| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:20:19:20:25 | request |
175180
| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:21:3:21:9 | request |
176181
| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:22:3:22:9 | request |
177-
| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:23:3:23:9 | request |
182+
| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:23:3:23:21 | getRequest(request) |
183+
| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:23:14:23:20 | request |
178184
| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:24:3:24:9 | request |
179185
| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:25:3:25:9 | request |
180186
| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:26:3:26:9 | request |
187+
| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:38:1:40:1 | return of function getRequest |
188+
| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:38:21:38:27 | request |
189+
| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:38:21:38:27 | request |
190+
| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:39:10:39:16 | request |
181191
| src/hapi.js:34:12:34:30 | function (req, h){} | src/hapi.js:34:22:34:24 | req |
182192
| src/hapiglue.js:13:14:15:5 | functio ... n\\n } | src/hapiglue.js:13:32:13:38 | request |
183193
| src/hapiglue.js:13:14:15:5 | functio ... n\\n } | src/hapiglue.js:13:32:13:38 | request |

0 commit comments

Comments
 (0)