@@ -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