@@ -361,28 +361,59 @@ module FastApi {
361361 }
362362
363363 /**
364- * A call to `append` on a `headers` of a FastAPI Response, with the `Set-Cookie`
365- * header-key.
364+ * A call to `append` on a `headers` of a FastAPI Response.
366365 */
367- private class HeadersAppendCookie extends Http:: Server:: CookieWrite :: Range ,
366+ private class HeadersAppend extends Http:: Server:: ResponseHeaderWrite :: Range ,
368367 DataFlow:: MethodCallNode
369368 {
370- HeadersAppendCookie ( ) {
371- exists ( DataFlow:: AttrRead headers , DataFlow :: Node keyArg |
369+ HeadersAppend ( ) {
370+ exists ( DataFlow:: AttrRead headers |
372371 headers .accesses ( instance ( ) , "headers" ) and
373- this .calls ( headers , "append" ) and
374- keyArg in [ this .getArg ( 0 ) , this .getArgByName ( "key" ) ] and
375- keyArg .getALocalSource ( ) .asExpr ( ) .( StringLiteral ) .getText ( ) .toLowerCase ( ) = "set-cookie"
372+ this .calls ( headers , "append" )
376373 )
377374 }
378375
379- override DataFlow:: Node getHeaderArg ( ) {
376+ override DataFlow:: Node getNameArg ( ) { result = [ this .getArg ( 0 ) , this .getArgByName ( "key" ) ] }
377+
378+ override DataFlow:: Node getValueArg ( ) {
380379 result in [ this .getArg ( 1 ) , this .getArgByName ( "value" ) ]
381380 }
382381
383- override DataFlow:: Node getNameArg ( ) { none ( ) }
382+ override predicate nameAllowsNewline ( ) { none ( ) }
383+
384+ override predicate valueAllowsNewline ( ) { none ( ) }
385+ }
386+
387+ /**
388+ * A dict-like write to an item of the `headers` attribute on a HTTP response, such as
389+ * `response.headers[name] = value`.
390+ */
391+ class HeaderSubscriptWrite extends Http:: Server:: ResponseHeaderWrite:: Range {
392+ DataFlow:: Node index ;
393+ DataFlow:: Node value ;
394+
395+ HeaderSubscriptWrite ( ) {
396+ exists ( SubscriptNode subscript , DataFlow:: AttrRead headerLookup |
397+ // To give `this` a value, we need to choose between either LHS or RHS,
398+ // and just go with the LHS
399+ this .asCfgNode ( ) = subscript
400+ |
401+ headerLookup .accesses ( instance ( ) , "headers" ) and
402+ exists ( DataFlow:: Node subscriptObj | subscriptObj .asCfgNode ( ) = subscript .getObject ( ) |
403+ headerLookup .flowsTo ( subscriptObj )
404+ ) and
405+ value .asCfgNode ( ) = subscript .( DefinitionNode ) .getValue ( ) and
406+ index .asCfgNode ( ) = subscript .getIndex ( )
407+ )
408+ }
409+
410+ override DataFlow:: Node getNameArg ( ) { result = index }
411+
412+ override DataFlow:: Node getValueArg ( ) { result = value }
413+
414+ override predicate nameAllowsNewline ( ) { none ( ) }
384415
385- override DataFlow :: Node getValueArg ( ) { none ( ) }
416+ override predicate valueAllowsNewline ( ) { none ( ) }
386417 }
387418 }
388419}
0 commit comments