Skip to content

Commit 92bdfd2

Browse files
authored
Fix #3402: Prevent invalid timestamps to reach the database (#3425)
1 parent b68cae5 commit 92bdfd2

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

kinto/core/resource/__init__.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,6 +1058,10 @@ def _extract_limit(self):
10581058

10591059
def _extract_filters(self):
10601060
"""Extracts filters from QueryString parameters."""
1061+
1062+
def is_valid_timestamp(value):
1063+
return isinstance(value, int) or re.match(r'^"?\d+"?$', str(value))
1064+
10611065
queryparams = self.request.validated["querystring"]
10621066

10631067
filters = []
@@ -1090,7 +1094,7 @@ def _extract_filters(self):
10901094
send_alert(self.request, message, url)
10911095
operator = COMPARISON.LT
10921096

1093-
if value == "" or not isinstance(value, (int, str, type(None))):
1097+
if value is not None and not is_valid_timestamp(value):
10941098
raise_invalid(self.request, **error_details)
10951099

10961100
filters.append(Filter(self.model.modified_field, value, operator))
@@ -1127,7 +1131,7 @@ def _extract_filters(self):
11271131
error_details["description"] = "Invalid character 0x00"
11281132
raise_invalid(self.request, **error_details)
11291133

1130-
if field == self.model.modified_field and value == "":
1134+
if field == self.model.modified_field and not is_valid_timestamp(value):
11311135
raise_invalid(self.request, **error_details)
11321136

11331137
filters.append(Filter(field, value, operator))

tests/core/resource/test_filter.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,15 @@ def test_filter_raises_error_if_last_modified_value_is_empty(self):
8383
self.validated["querystring"] = {"lt_last_modified": ""}
8484
self.assertRaises(httpexceptions.HTTPBadRequest, self.resource.plural_get)
8585

86+
def test_filter_raises_error_if_last_modified_value_is_not_int(self):
87+
bad_value = "171103608603432920249' or '7127'='7127"
88+
self.validated["querystring"] = {"last_modified": bad_value}
89+
self.assertRaises(httpexceptions.HTTPBadRequest, self.resource.plural_get)
90+
self.validated["querystring"] = {"_since": bad_value}
91+
self.assertRaises(httpexceptions.HTTPBadRequest, self.resource.plural_get)
92+
self.validated["querystring"] = {"lt_last_modified": bad_value}
93+
self.assertRaises(httpexceptions.HTTPBadRequest, self.resource.plural_get)
94+
8695
def test_filter_works_with_since_none(self):
8796
self.validated["querystring"] = {"_since": None}
8897
result = self.resource.plural_get()

0 commit comments

Comments
 (0)