@@ -245,4 +245,60 @@ module Starlette {
245245
246246 override DataFlow:: Node getAPathArgument ( ) { result = this .getParameter ( 0 , "path" ) .asSink ( ) }
247247 }
248+
249+ /**
250+ * Provides models for the `starlette.requests.Request` class
251+ *
252+ * See https://www.starlette.io/requests/.
253+ */
254+ module Request {
255+ /** Gets a reference to the `starlette.requests.Request` class. */
256+ API:: Node classRef ( ) {
257+ result = API:: moduleImport ( "starlette" ) .getMember ( "requests" ) .getMember ( "Request" )
258+ or
259+ result = API:: moduleImport ( "fastapi" ) .getMember ( "Request" )
260+ }
261+
262+ /**
263+ * A source of instances of `starlette.requests.Request`, extend this class to model new instances.
264+ *
265+ * This can include instantiations of the class, return values from function
266+ * calls, or a special parameter that will be set when functions are called by an external
267+ * library.
268+ *
269+ * Use the predicate `Request::instance()` to get references to instances of `starlette.requests.Request`.
270+ */
271+ abstract class InstanceSource extends DataFlow:: LocalSourceNode { }
272+
273+ /** A direct instantiation of `starlette.requests.Request`. */
274+ private class ClassInstantiation extends InstanceSource {
275+ ClassInstantiation ( ) { this = classRef ( ) .getAnInstance ( ) .asSource ( ) }
276+ }
277+
278+ /** Gets a reference to an instance of `starlette.requests.Request`. */
279+ private DataFlow:: TypeTrackingNode instance ( DataFlow:: TypeTracker t ) {
280+ t .start ( ) and
281+ result instanceof InstanceSource
282+ or
283+ exists ( DataFlow:: TypeTracker t2 | result = instance ( t2 ) .track ( t2 , t ) )
284+ }
285+
286+ /** Gets a reference to an instance of `starlette.requests.Request`. */
287+ DataFlow:: Node instance ( ) { instance ( DataFlow:: TypeTracker:: end ( ) ) .flowsTo ( result ) }
288+
289+ /**
290+ * Taint propagation for `starlette.requests.Request`.
291+ */
292+ private class InstanceTaintSteps extends InstanceTaintStepsHelper {
293+ InstanceTaintSteps ( ) { this = "starlette.requests.Request" }
294+
295+ override DataFlow:: Node getInstance ( ) { result = instance ( ) }
296+
297+ override string getAttributeName ( ) { result in [ "cookies" ] }
298+
299+ override string getMethodName ( ) { none ( ) }
300+
301+ override string getAsyncMethodName ( ) { result in [ "body" , "json" , "form" , "stream" ] }
302+ }
303+ }
248304}
0 commit comments