Skip to content

Commit 8fb2faa

Browse files
Add additional info to concept tests
1 parent 2b935e5 commit 8fb2faa

File tree

3 files changed

+65
-41
lines changed

3 files changed

+65
-41
lines changed

python/ql/test/experimental/meta/ConceptsTest.qll

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,13 @@ module HttpServerHttpResponseTest implements TestSig {
320320
}
321321

322322
module HttpResponseHeaderWriteTest implements TestSig {
323-
string getARelevantTag() { result = ["headerWriteName", "headerWriteValue", "headerWriteBulk"] }
323+
string getARelevantTag() {
324+
result =
325+
[
326+
"headerWriteNameUnsanitized", "headerWriteNameSanitized", "headerWriteValueUnsanitized",
327+
"headerWriteValueSanitized", "headerWriteBulk"
328+
]
329+
}
324330

325331
predicate hasActualResult(Location location, string element, string tag, string value) {
326332
exists(location.getFile().getRelativePath()) and
@@ -330,26 +336,43 @@ module HttpResponseHeaderWriteTest implements TestSig {
330336
element = node.toString()
331337
|
332338
node = write.getNameArg() and
333-
tag = "headerWriteName" and
334-
(if write.nameAllowsNewline() then value = "unsanitized" else value = "sanitized")
339+
(
340+
if write.nameAllowsNewline()
341+
then tag = "headerWriteNameUnsanitized"
342+
else tag = "headerWriteNameSanitized"
343+
) and
344+
value = prettyNodeForInlineTest(node)
335345
or
336346
node = write.getValueArg() and
337-
tag = "headerWriteValue" and
338-
(if write.valueAllowsNewline() then value = "unsanitized" else value = "sanitized")
347+
(
348+
if write.valueAllowsNewline()
349+
then tag = "headerWriteValueUnsanitized"
350+
else tag = "headerWriteValueSanitized"
351+
) and
352+
value = prettyNodeForInlineTest(node)
339353
)
340354
or
341-
exists(Http::Server::ResponseHeaderBulkWrite write |
342-
location = write.getBulkArg().getLocation() and
343-
element = write.getBulkArg().toString() and
355+
exists(Http::Server::ResponseHeaderBulkWrite write, DataFlow::Node node |
356+
node = write.getBulkArg() and
357+
location = node.getLocation() and
358+
element = node.toString() and
344359
(
345360
tag = "headerWriteBulk" and
346-
value = ""
361+
value = prettyNodeForInlineTest(node)
347362
or
348-
tag = "headerWriteName" and
349-
(if write.nameAllowsNewline() then value = "unsanitized" else value = "sanitized")
363+
(
364+
if write.nameAllowsNewline()
365+
then tag = "headerWriteNameUnsanitized"
366+
else tag = "headerWriteNameSanitized"
367+
) and
368+
value = ""
350369
or
351-
tag = "headerWriteValue" and
352-
(if write.valueAllowsNewline() then value = "unsanitized" else value = "sanitized")
370+
(
371+
if write.valueAllowsNewline()
372+
then tag = "headerWriteValueUnsanitized"
373+
else tag = "headerWriteValueSanitized"
374+
) and
375+
value = ""
353376
)
354377
)
355378
)

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

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ def response_modification1(): # $requestHandler
118118
@app.route("/content-type/response-modification2") # $routeSetup="/content-type/response-modification2"
119119
def response_modification2(): # $requestHandler
120120
resp = make_response("<h1>hello</h1>") # $HttpResponse mimetype=text/html responseBody="<h1>hello</h1>"
121-
resp.headers["content-type"] = "text/plain" # $ headerWriteName=unsanitized headerWriteValue=sanitized MISSING: HttpResponse mimetype=text/plain
121+
resp.headers["content-type"] = "text/plain" # $ headerWriteNameUnsanitized="content-type" headerWriteValueSanitized="text/plain" MISSING: HttpResponse mimetype=text/plain
122122
return resp # $ SPURIOUS: HttpResponse mimetype=text/html responseBody=resp
123123

124124

@@ -148,23 +148,23 @@ def Response3(): # $requestHandler
148148
@app.route("/content-type/Response4") # $routeSetup="/content-type/Response4"
149149
def Response4(): # $requestHandler
150150
# note: capitalization of Content-Type does not matter
151-
resp = Response("<h1>hello</h1>", headers={"Content-TYPE": "text/plain"}) # $ headerWriteBulk headerWriteName=unsanitized headerWriteValue=sanitized HttpResponse responseBody="<h1>hello</h1>" SPURIOUS: mimetype=text/html MISSING: mimetype=text/plain
151+
resp = Response("<h1>hello</h1>", headers={"Content-TYPE": "text/plain"}) # $ headerWriteBulk=Dict headerWriteNameUnsanitized headerWriteValueSanitized HttpResponse responseBody="<h1>hello</h1>" SPURIOUS: mimetype=text/html MISSING: mimetype=text/plain
152152
return resp # $ SPURIOUS: HttpResponse mimetype=text/html responseBody=resp
153153

154154

155155
@app.route("/content-type/Response5") # $routeSetup="/content-type/Response5"
156156
def Response5(): # $requestHandler
157157
# content_type argument takes priority (and result is text/plain)
158158
# note: capitalization of Content-Type does not matter
159-
resp = Response("<h1>hello</h1>", headers={"Content-TYPE": "text/html"}, content_type="text/plain; charset=utf-8") # $ headerWriteBulk headerWriteName=unsanitized headerWriteValue=sanitized HttpResponse mimetype=text/plain responseBody="<h1>hello</h1>"
159+
resp = Response("<h1>hello</h1>", headers={"Content-TYPE": "text/html"}, content_type="text/plain; charset=utf-8") # $ headerWriteBulk=Dict headerWriteNameUnsanitized headerWriteValueSanitized HttpResponse mimetype=text/plain responseBody="<h1>hello</h1>"
160160
return resp # $ SPURIOUS: HttpResponse mimetype=text/html responseBody=resp
161161

162162

163163
@app.route("/content-type/Response6") # $routeSetup="/content-type/Response6"
164164
def Response6(): # $requestHandler
165165
# mimetype argument takes priority over header (and result is text/plain)
166166
# note: capitalization of Content-Type does not matter
167-
resp = Response("<h1>hello</h1>", headers={"Content-TYPE": "text/html"}, mimetype="text/plain") # $ headerWriteBulk headerWriteName=unsanitized headerWriteValue=sanitized HttpResponse mimetype=text/plain responseBody="<h1>hello</h1>"
167+
resp = Response("<h1>hello</h1>", headers={"Content-TYPE": "text/html"}, mimetype="text/plain") # $ headerWriteBulk=Dict headerWriteNameUnsanitized headerWriteValueSanitized HttpResponse mimetype=text/plain responseBody="<h1>hello</h1>"
168168
return resp # $ SPURIOUS: HttpResponse mimetype=text/html responseBody=resp
169169

170170

@@ -208,7 +208,7 @@ def setting_cookie(): # $requestHandler
208208
resp = make_response() # $ HttpResponse mimetype=text/html
209209
resp.set_cookie("key", "value") # $ CookieWrite CookieName="key" CookieValue="value"
210210
resp.set_cookie(key="key", value="value") # $ CookieWrite CookieName="key" CookieValue="value"
211-
resp.headers.add("Set-Cookie", "key2=value2") # $ headerWriteName=unsanitized headerWriteValue=sanitized MISSING: CookieWrite CookieRawHeader="key2=value2"
211+
resp.headers.add("Set-Cookie", "key2=value2") # $ headerWriteNameUnsanitized="Set-Cookie" headerWriteValueSanitized="key2=value2" MISSING: CookieWrite CookieRawHeader="key2=value2"
212212
resp.delete_cookie("key3") # $ CookieWrite CookieName="key3"
213213
resp.delete_cookie(key="key3") # $ CookieWrite CookieName="key3"
214214
return resp # $ SPURIOUS: HttpResponse mimetype=text/html responseBody=resp
@@ -220,28 +220,29 @@ def setting_cookie(): # $requestHandler
220220
@app.route("/headers") # $routeSetup="/headers"
221221
def headers(): # $requestHandler
222222
resp1 = Response() # $ HttpResponse mimetype=text/html
223-
resp1.headers['X-MyHeader'] = 'a' # $ headerWriteName=unsanitized headerWriteValue=sanitized
223+
resp1.headers["X-MyHeader"] = "a" # $ headerWriteNameUnsanitized="X-MyHeader" headerWriteValueSanitized="a"
224224
resp2 = make_response() # $ HttpResponse mimetype=text/html
225-
resp2.headers['X-MyHeader'] = 'a' # $ headerWriteName=unsanitized headerWriteValue=sanitized
226-
resp2.headers.extend({'X-MyHeader2': 'b'}) # $ headerWriteBulk headerWriteName=unsanitized headerWriteValue=sanitized
227-
resp3 = make_response("hello", 200, {'X-MyHeader3': 'c'}) # $ HttpResponse mimetype=text/html responseBody="hello" headerWriteBulk headerWriteName=unsanitized headerWriteValue=sanitized
228-
resp4 = make_response("hello", {'X-MyHeader4': 'd'}) # $ HttpResponse mimetype=text/html responseBody="hello" headerWriteBulk headerWriteName=unsanitized headerWriteValue=sanitized
229-
return resp4 # $ SPURIOUS: HttpResponse mimetype=text/html responseBody=resp4
225+
resp2.headers["X-MyHeader"] = "aa" # $ headerWriteNameUnsanitized="X-MyHeader" headerWriteValueSanitized="aa"
226+
resp2.headers.extend({"X-MyHeader2": "b"}) # $ headerWriteBulk=Dict headerWriteNameUnsanitized headerWriteValueSanitized
227+
resp3 = make_response("hello", 200, {"X-MyHeader3": "c"}) # $ HttpResponse mimetype=text/html responseBody="hello" headerWriteBulk=Dict headerWriteNameUnsanitized headerWriteValueSanitized
228+
resp4 = make_response("hello", {"X-MyHeader4": "d"}) # $ HttpResponse mimetype=text/html responseBody="hello" headerWriteBulk=Dict headerWriteNameUnsanitized headerWriteValueSanitized
229+
resp5 = Response(headers={"X-MyHeader5":"e"}) # $ HttpResponse mimetype=text/html headerWriteBulk=Dict headerWriteNameUnsanitized headerWriteValueSanitized
230+
return resp5 # $ SPURIOUS: HttpResponse mimetype=text/html responseBody=resp5
230231

231232
@app.route("/werkzeug-headers") # $routeSetup="/werkzeug-headers"
232233
def werkzeug_headers(): # $requestHandler
233234
response = Response() # $ HttpResponse mimetype=text/html
234235
headers = Headers()
235-
headers.add("X-MyHeader1", "a") # $ headerWriteName=unsanitized headerWriteValue=sanitized
236-
headers.add_header("X-MyHeader2", "b") # $ headerWriteName=unsanitized headerWriteValue=sanitized
237-
headers.set("X-MyHeader3", "c") # $ headerWriteName=unsanitized headerWriteValue=sanitized
238-
headers.setdefault("X-MyHeader4", "d") # $ headerWriteName=unsanitized headerWriteValue=sanitized
239-
headers.__setitem__("X-MyHeader5", "e") # $ headerWriteName=unsanitized headerWriteValue=sanitized
240-
headers["X-MyHeader6"] = "f" # $ headerWriteName=unsanitized headerWriteValue=sanitized
236+
headers.add("X-MyHeader1", "a") # $ headerWriteNameUnsanitized="X-MyHeader1" headerWriteValueSanitized="a"
237+
headers.add_header("X-MyHeader2", "b") # $ headerWriteNameUnsanitized="X-MyHeader2" headerWriteValueSanitized="b"
238+
headers.set("X-MyHeader3", "c") # $ headerWriteNameUnsanitized="X-MyHeader3" headerWriteValueSanitized="c"
239+
headers.setdefault("X-MyHeader4", "d") # $ headerWriteNameUnsanitized="X-MyHeader4" headerWriteValueSanitized="d"
240+
headers.__setitem__("X-MyHeader5", "e") # $ headerWriteNameUnsanitized="X-MyHeader5" headerWriteValueSanitized="e"
241+
headers["X-MyHeader6"] = "f" # $ headerWriteNameUnsanitized="X-MyHeader6" headerWriteValueSanitized="f"
241242
h1 = {"X-MyHeader7": "g"}
242-
headers.extend(h1) # $ headerWriteBulk headerWriteName=unsanitized headerWriteValue=sanitized
243+
headers.extend(h1) # $ headerWriteBulk=h1 headerWriteNameUnsanitized headerWriteValueSanitized
243244
h2 = [("X-MyHeader8", "h")]
244-
headers.extend(h2) # $ headerWriteBulk headerWriteName=unsanitized headerWriteValue=sanitized
245+
headers.extend(h2) # $ headerWriteBulk=h2 headerWriteNameUnsanitized headerWriteValueSanitized
245246
response.headers = headers
246247
return response # $ SPURIOUS: HttpResponse mimetype=text/html responseBody=response
247248

python/ql/test/library-tests/frameworks/stdlib/wsgiref_simple_server_test.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def func(environ, start_response): # $ requestHandler
1818
environ, # $ tainted
1919
environ["PATH_INFO"], # $ tainted
2020
)
21-
write = start_response("200 OK", [("Content-Type", "text/plain")]) # $ headerWriteBulk headerWriteName=unsanitized headerWriteValue=unsanitized
21+
write = start_response("200 OK", [("Content-Type", "text/plain")]) # $ headerWriteBulk=List headerWriteNameUnsanitized headerWriteValueUnsanitized
2222
write(b"hello") # $ HttpResponse responseBody=b"hello"
2323
write(data=b" ") # $ HttpResponse responseBody=b" "
2424

@@ -33,16 +33,16 @@ def __init__(self):
3333
self.set_app(self.my_method)
3434

3535
def my_method(self, _env, start_response): # $ requestHandler
36-
start_response("200 OK", []) # $ headerWriteBulk headerWriteName=unsanitized headerWriteValue=unsanitized
36+
start_response("200 OK", []) # $ headerWriteBulk=List headerWriteNameUnsanitized headerWriteValueUnsanitized
3737
return [b"my_method"] # $ HttpResponse responseBody=List
3838

3939
def func2(environ, start_response): # $ requestHandler
40-
headers = wsgiref.headers.Headers([("Content-Type", "text/plain")]) # $ headerWriteBulk headerWriteName=unsanitized headerWriteValue=unsanitized
41-
headers.add_header("X-MyHeader", "a") # $ headerWriteName=unsanitized headerWriteValue=unsanitized
42-
headers.setdefault("X-MyHeader2", "b") # $ headerWriteName=unsanitized headerWriteValue=unsanitized
43-
headers.__setitem__("X-MyHeader3", "c") # $ headerWriteName=unsanitized headerWriteValue=unsanitized
44-
headers["X-MyHeader4"] = "d" # $ headerWriteName=unsanitized headerWriteValue=unsanitized
45-
start_response(status, headers) # $ headerWriteBulk headerWriteName=unsanitized headerWriteValue=unsanitized
40+
headers = wsgiref.headers.Headers([("Content-Type", "text/plain")]) # $ headerWriteBulk=List headerWriteNameUnsanitized headerWriteValueUnsanitized
41+
headers.add_header("X-MyHeader", "a") # $ headerWriteNameUnsanitized="X-MyHeader" headerWriteValueUnsanitized="a"
42+
headers.setdefault("X-MyHeader2", "b") # $ headerWriteNameUnsanitized="X-MyHeader2" headerWriteValueUnsanitized="b"
43+
headers.__setitem__("X-MyHeader3", "c") # $ headerWriteNameUnsanitized="X-MyHeader3" headerWriteValueUnsanitized="c"
44+
headers["X-MyHeader4"] = "d" # $ headerWriteNameUnsanitized="X-MyHeader4" headerWriteValueUnsanitized="d"
45+
start_response(status, headers) # $ headerWriteBulk=headers headerWriteNameUnsanitized headerWriteValueUnsanitized
4646
return [b"Hello"] # $ HttpResponse responseBody=List
4747

4848
case = sys.argv[1]
@@ -54,7 +54,7 @@ def func2(environ, start_response): # $ requestHandler
5454
elif case == "3":
5555
server = MyServer()
5656
def func3(_env, start_response): # $ requestHandler
57-
start_response("200 OK", []) # $ headerWriteBulk headerWriteName=unsanitized headerWriteValue=unsanitized
57+
start_response("200 OK", []) # $ headerWriteBulk=List headerWriteNameUnsanitized headerWriteValueUnsanitized
5858
return [b"foo"] # $ HttpResponse responseBody=List
5959
server.set_app(func3)
6060
elif case == "4":

0 commit comments

Comments
 (0)