Skip to content

Commit 7704801

Browse files
Change fastapi raw cookie header models to header write models
1 parent a0201e9 commit 7704801

File tree

3 files changed

+15
-16
lines changed

3 files changed

+15
-16
lines changed

python/ql/lib/semmle/python/Concepts.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1239,7 +1239,7 @@ module Http {
12391239
{
12401240
CookieHeaderWrite() {
12411241
exists(StringLiteral str |
1242-
str.getText() = "Set-Cookie" and
1242+
str.getText().toLowerCase() = "set-cookie" and
12431243
DataFlow::exprNode(str)
12441244
.(DataFlow::LocalSourceNode)
12451245
.flowsTo(this.(Http::Server::ResponseHeaderWrite).getNameArg())

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

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -361,28 +361,27 @@ 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() }
384383

385-
override DataFlow::Node getValueArg() { none() }
384+
override predicate valueAllowsNewline() { none() }
386385
}
387386
}
388387
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
async def response_parameter(response: Response): # $ requestHandler
1212
response.set_cookie("key", "value") # $ CookieWrite CookieName="key" CookieValue="value"
1313
response.set_cookie(key="key", value="value") # $ CookieWrite CookieName="key" CookieValue="value"
14-
response.headers.append("Set-Cookie", "key2=value2") # $ CookieWrite CookieRawHeader="key2=value2"
15-
response.headers.append(key="Set-Cookie", value="key2=value2") # $ CookieWrite CookieRawHeader="key2=value2"
16-
response.headers["X-MyHeader"] = "header-value"
14+
response.headers.append("Set-Cookie", "key2=value2") # $ headerWriteName="Set-Cookie" headerWriteValue="key2=value2" CookieWrite CookieRawHeader="key2=value2"
15+
response.headers.append(key="Set-Cookie", value="key2=value2") # $ headerWriteName="Set-Cookie" headerWriteValue="key2=value2" CookieWrite CookieRawHeader="key2=value2"
16+
response.headers["X-MyHeader"] = "header-value" # $ MISSING: headerWriteName="X-MyHeader" headerWriteValue="header-value"
1717
response.status_code = 418
1818
return {"message": "response as parameter"} # $ HttpResponse mimetype=application/json responseBody=Dict
1919

@@ -45,7 +45,7 @@ async def response_parameter_custom_type(response: MyXmlResponse): # $ requestHa
4545
print(type(response))
4646
assert type(response) == fastapi.responses.Response
4747
response.set_cookie("key", "value") # $ CookieWrite CookieName="key" CookieValue="value"
48-
response.headers["Custom-Response-Type"] = "yes, but only after function has run"
48+
response.headers["Custom-Response-Type"] = "yes, but only after function has run" # $ MISSING: headerWriteName="Custom-Response-Typer" headerWriteValue="yes, but only after function has run"
4949
xml_data = "<foo>FOO</foo>"
5050
return xml_data # $ HttpResponse responseBody=xml_data mimetype=application/xml
5151

0 commit comments

Comments
 (0)