@@ -216,6 +216,17 @@ private module Tornado {
216216 /** Gets a reference to one of the methods `get_arguments`, `get_body_arguments`, `get_query_arguments`. */
217217 DataFlow:: Node argumentsMethod ( ) { result = argumentsMethod ( DataFlow:: TypeTracker:: end ( ) ) }
218218
219+ /** Gets a reference the `redirect` method. */
220+ private DataFlow:: Node redirectMethod ( DataFlow:: TypeTracker t ) {
221+ t .startInAttr ( "redirect" ) and
222+ result = instance ( )
223+ or
224+ exists ( DataFlow:: TypeTracker t2 | result = redirectMethod ( t2 ) .track ( t2 , t ) )
225+ }
226+
227+ /** Gets a reference the `redirect` method. */
228+ DataFlow:: Node redirectMethod ( ) { result = redirectMethod ( DataFlow:: TypeTracker:: end ( ) ) }
229+
219230 private class AdditionalTaintStep extends TaintTracking:: AdditionalTaintStep {
220231 override predicate step ( DataFlow:: Node nodeFrom , DataFlow:: Node nodeTo ) {
221232 // Method access
@@ -540,4 +551,31 @@ private module Tornado {
540551 not result = this .getArg ( 0 )
541552 }
542553 }
554+
555+ // ---------------------------------------------------------------------------
556+ // Response modeling
557+ // ---------------------------------------------------------------------------
558+ /**
559+ * A call to `tornado.web.RequestHandler.write` method.
560+ *
561+ * See https://www.tornadoweb.org/en/stable/web.html?highlight=write#tornado.web.RequestHandler.write
562+ */
563+ private class TornadoRequestHandlerRedirectCall extends HTTP:: Server:: HttpRedirectResponse:: Range ,
564+ DataFlow:: CfgNode {
565+ override CallNode node ;
566+
567+ TornadoRequestHandlerRedirectCall ( ) {
568+ node .getFunction ( ) = tornado:: web:: RequestHandler:: redirectMethod ( ) .asCfgNode ( )
569+ }
570+
571+ override DataFlow:: Node getRedirectLocation ( ) {
572+ result .asCfgNode ( ) in [ node .getArg ( 0 ) , node .getArgByName ( "url" ) ]
573+ }
574+
575+ override DataFlow:: Node getBody ( ) { none ( ) }
576+
577+ override string getMimetypeDefault ( ) { none ( ) }
578+
579+ override DataFlow:: Node getMimetypeOrContentTypeArg ( ) { none ( ) }
580+ }
543581}
0 commit comments