Skip to content

Commit 1bb62b0

Browse files
committed
Improve input validation
1 parent d61ea47 commit 1bb62b0

File tree

4 files changed

+12
-8
lines changed

4 files changed

+12
-8
lines changed

src/backend/authentications/models.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ class Authentication(BaseInput, BaseEncrypted):
1616

1717
name = models.TextField(
1818
max_length=100,
19-
validators=[Validator(Regex.NAME.value, code="name")],
19+
validators=[Validator(Regex.NAME.value, code="name", deny_injections=True)],
2020
null=True,
2121
blank=True,
2222
)
2323
_secret = models.TextField(
2424
max_length=500,
25-
validators=[Validator(Regex.SECRET.value, code="secret")],
25+
validators=[Validator(Regex.SECRET.value, code="secret", deny_injections=True)],
2626
null=True,
2727
blank=True,
2828
db_column="secret",

src/backend/http_headers/models.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ class HttpHeader(BaseInput):
2626
null=True,
2727
)
2828
key = models.TextField(
29-
max_length=100, validators=[Validator(Regex.NAME.value, code="key")]
29+
max_length=100, validators=[Validator(Regex.NAME.value, code="key", deny_injections=True)]
3030
)
3131
value = models.TextField(
32-
max_length=500, validators=[Validator(Regex.TEXT.value, code="value")]
32+
max_length=500, validators=[Validator(Regex.TEXT.value, code="value", deny_injections=True)]
3333
)
3434

3535
filters = [BaseInput.Filter(type=str, field="key")]

src/backend/parameters/models.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ class InputTechnology(BaseInput):
1616
Target, related_name="input_technologies", on_delete=models.CASCADE
1717
)
1818
name = models.TextField(
19-
max_length=100, validators=[Validator(Regex.NAME.value, code="name")]
19+
max_length=100, validators=[Validator(Regex.NAME.value, code="name", deny_injections=True)]
2020
)
2121
version = models.TextField(
2222
max_length=100,
23-
validators=[Validator(Regex.NAME.value, code="version")],
23+
validators=[Validator(Regex.NAME.value, code="version", deny_injections=True)],
2424
blank=True,
2525
null=True,
2626
)
@@ -69,7 +69,7 @@ class InputVulnerability(BaseInput):
6969
Target, related_name="input_vulnerabilities", on_delete=models.CASCADE
7070
)
7171
cve = models.TextField(
72-
max_length=20, validators=[Validator(Regex.CVE.value, code="cve")]
72+
max_length=20, validators=[Validator(Regex.CVE.value, code="cve", deny_injections=True)]
7373
)
7474

7575
filters = [

src/backend/security/validators/input_validator.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class Regex(Enum):
2121
PATH_WITH_QUERYPARAMS = r"[\w\.\-_/\\#?&%$]{0,500}"
2222
CVE = r"CVE-\d{4}-\d{1,7}"
2323
SECRET = r"[\w\./\-=\+,:<>¿?¡!#&$()@%\[\]\{\}\*]{1,500}"
24+
IS_INJECTION = r"[^;\"&</>$]*"
2425

2526

2627
class Validator(RegexValidator):
@@ -31,7 +32,9 @@ def __init__(
3132
code: str | None = None,
3233
inverse_match: bool | None = ..., # type: ignore
3334
flags: RegexFlag | None = None,
35+
deny_injections: bool = False
3436
) -> None:
37+
self.deny_injections = deny_injections
3538
super().__init__(regex, message, code, inverse_match, flags)
3639

3740
def __call__(self, value: str | None) -> None:
@@ -43,7 +46,8 @@ def __call__(self, value: str | None) -> None:
4346
invalid_input = (
4447
not bool(regex_matches) if self.inverse_match else bool(regex_matches)
4548
)
46-
if invalid_input:
49+
is_injection = bool(re.fullmatch(Regex.IS_INJECTION, value)) if self.deny_injections else False
50+
if invalid_input or is_injection:
4751
logger.warning(
4852
f"[Security] Invalid value that doesn't match the regex '{self.regex}'"
4953
)

0 commit comments

Comments
 (0)