Skip to content

Commit ebcde45

Browse files
committed
Copy Express modelling of request input
1 parent dbdd8b4 commit ebcde45

1 file changed

Lines changed: 22 additions & 13 deletions

File tree

  • javascript/ql/lib/semmle/javascript/frameworks

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

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,19 @@ module Hapi {
102102
override RequestSource src;
103103
}
104104

105+
private DataFlow::SourceNode requestInputRef(
106+
RouteHandler rh, string property, DataFlow::TypeTracker t
107+
) {
108+
t.start() and
109+
result = rh.getRequestParameter().getAPropertyRead(property)
110+
or
111+
exists(DataFlow::TypeTracker t2 | result = requestInputRef(rh, property, t2).track(t2, t))
112+
}
113+
114+
private DataFlow::SourceNode requestInputRef(RouteHandler rh, string property) {
115+
result = requestInputRef(rh, property, DataFlow::TypeTracker::end())
116+
}
117+
105118
/**
106119
* An access to a user-controlled Hapi request input.
107120
*/
@@ -116,22 +129,18 @@ module Hapi {
116129
// `request.rawPayload`
117130
this.(DataFlow::PropRead).accesses(request, "rawPayload")
118131
or
119-
exists(DataFlow::PropRead payload |
120-
// `request.payload.name`, or `request.payload` when the object is forwarded.
121-
payload.accesses(request, "payload") and
122-
if exists(payload.getAPropertyRead())
123-
then this = payload.getAPropertyRead()
124-
else this = payload
125-
)
132+
// `request.payload` is an object, so prefer a property read if possible.
133+
if exists(requestInputRef(rh, "payload").getAPropertyRead())
134+
then this = requestInputRef(rh, "payload").getAPropertyRead()
135+
else this = rh.getRequestParameter().getAPropertyRead("payload")
126136
)
127137
or
128138
kind = "parameter" and
129-
exists(DataFlow::PropRead parameter |
130-
// `request.query.name` / `request.params.name`, or the object when it is forwarded.
131-
parameter.accesses(request, ["query", "params"]) and
132-
if exists(parameter.getAPropertyRead())
133-
then this = parameter.getAPropertyRead()
134-
else this = parameter
139+
exists(string property | property = ["query", "params"] |
140+
// These are objects, so prefer a property read if possible.
141+
if exists(requestInputRef(rh, property).getAPropertyRead())
142+
then this = requestInputRef(rh, property).getAPropertyRead()
143+
else this = rh.getRequestParameter().getAPropertyRead(property)
135144
)
136145
or
137146
exists(DataFlow::PropRead url |

0 commit comments

Comments
 (0)