Skip to content

Commit ba011fb

Browse files
authored
Merge pull request #8601 from zbazztian/recognize-flask-named-body-param
Python: Flask: Identify body contents passed via named response parameter in invocations of Response constructor
2 parents 29a5bdb + 504e7e4 commit ba011fb

File tree

3 files changed

+17
-5
lines changed

3 files changed

+17
-5
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* Improved modeling of Flask `Response` objects, so passing a response body with the keyword argument `response` is now recognized.

python/ql/lib/semmle/python/frameworks/Flask.qll

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,9 @@ module Flask {
122122
private class ClassInstantiation extends InstanceSource, DataFlow::CallCfgNode {
123123
ClassInstantiation() { this = classRef().getACall() }
124124

125-
override DataFlow::Node getBody() { result = this.getArg(0) }
125+
override DataFlow::Node getBody() {
126+
result in [this.getArg(0), this.getArgByName("response")]
127+
}
126128

127129
override string getMimetypeDefault() { result = "text/html" }
128130

python/ql/test/library-tests/frameworks/flask/response_test.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,22 +37,28 @@ def html4(): # $requestHandler
3737

3838
@app.route("/html5") # $routeSetup="/html5"
3939
def html5(): # $requestHandler
40+
resp = Response(response="<h1>hello</h1>") # $HttpResponse mimetype=text/html responseBody="<h1>hello</h1>"
41+
return resp # $ SPURIOUS: HttpResponse mimetype=text/html responseBody=resp
42+
43+
44+
@app.route("/html6") # $routeSetup="/html6"
45+
def html6(): # $requestHandler
4046
# note: flask.Flask.response_class is set to `flask.Response` by default.
4147
# it can be overridden, but we don't try to handle that right now.
4248
resp = Flask.response_class("<h1>hello</h1>") # $HttpResponse mimetype=text/html responseBody="<h1>hello</h1>"
4349
return resp # $ SPURIOUS: HttpResponse mimetype=text/html responseBody=resp
4450

4551

46-
@app.route("/html6") # $routeSetup="/html6"
47-
def html6(): # $requestHandler
52+
@app.route("/html7") # $routeSetup="/html7"
53+
def html7(): # $requestHandler
4854
# note: app.response_class (flask.Flask.response_class) is set to `flask.Response` by default.
4955
# it can be overridden, but we don't try to handle that right now.
5056
resp = app.response_class("<h1>hello</h1>") # $HttpResponse mimetype=text/html responseBody="<h1>hello</h1>"
5157
return resp # $ SPURIOUS: HttpResponse mimetype=text/html responseBody=resp
5258

5359

54-
@app.route("/html7") # $routeSetup="/html7"
55-
def html7(): # $requestHandler
60+
@app.route("/html8") # $routeSetup="/html8"
61+
def html8(): # $requestHandler
5662
resp = make_response() # $HttpResponse mimetype=text/html
5763
resp.set_data("<h1>hello</h1>") # $ MISSING: responseBody="<h1>hello</h1>"
5864
return resp # $ SPURIOUS: HttpResponse mimetype=text/html responseBody=resp

0 commit comments

Comments
 (0)