From 64c2810e3b9e9fe010acb899a11f4e358463e0a3 Mon Sep 17 00:00:00 2001 From: Junaid Date: Tue, 13 Oct 2026 22:37:51 +0530 Subject: [PATCH] Reject non-ASCII case equivalents in IBANs --- src/validators/iban.py | 5 ++++- tests/test_iban.py | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/validators/iban.py b/src/validators/iban.py index ff39cd73..cc6224b7 100644 --- a/src/validators/iban.py +++ b/src/validators/iban.py @@ -38,7 +38,10 @@ def iban(value: str, /): (ValidationError): If `value` is an invalid IBAN code. """ return ( - (re.match(r"^[a-z]{2}[0-9]{2}[a-z0-9]{11,30}$", value, re.IGNORECASE) and _mod_check(value)) + ( + re.match(r"^[a-z]{2}[0-9]{2}[a-z0-9]{11,30}$", value, re.IGNORECASE | re.ASCII) + and _mod_check(value) + ) if value else False ) diff --git a/tests/test_iban.py b/tests/test_iban.py index 329a20e0..16635f32 100644 --- a/tests/test_iban.py +++ b/tests/test_iban.py @@ -23,3 +23,9 @@ def test_returns_true_on_valid_lowercase_iban(value: str): def test_returns_failed_validation_on_invalid_iban(value: str): """Test returns failed validation on invalid iban.""" assert isinstance(iban(value), ValidationError) + + +@pytest.mark.parametrize("value", ["\u0131T60X0542811101000000123456", "GB82WE\u017fT12345698765432"]) +def test_rejects_non_ascii_case_equivalents(value: str): + """Unicode case equivalents must not pass the ASCII IBAN format check.""" + assert isinstance(iban(value), ValidationError)