Новое в Symfony 6.3 — Ограничение No­Suspicious­Characters

Источник: «New in Symfony 6.3: NoSuspiciousCharacters Constraint»
Symfony 6.3 включает новое ограничение NoSuspiciousCharacters, чтобы избежать spoofing атак, основанных на использовании символов, которые отличаются, но внешне выглядят одинаково.

Взгляните на два следующих доменных имени: "symfony.com" и "ѕymfony.com". С виду они похожие, но это не одинаковые символы. Во втором домене первой буквой идёт не s (строчная буква s в латинице), а ѕ (Зело, македонское название — дзе, старинное название — зело́ буква расширенной кириллицы, 10-я буква македонского алфавита, 8-я буква старо- и церковнославянских азбук, а также валахо-молдавской кириллицы; использовалась и в других языках).

Использование разных, но одинаково выглядящих символов лежит в основе атак на омографы IDN, тип атаки с подменой. Вот почему рекомендуется проверять предоставленные пользователем общедоступные идентификаторы на наличие подозрительных символов, чтобы предотвратить такие атаки.

Однако учитывая, что Unicode определяет более 150000 допустимых символов, это непростая задача. Например, знаете ли вы, что существуют невидимые символы, такие как проблем нулевой ширины? А как на счёт смешения 8 (цифра восемь) и (цифра четыре в Бенгали)? Не забывайте о комбинировании символов, таких как комбинированная точка, которую можно поставить после символа i, чтобы сделать его невидимым.

В Symfony 6.3 мы представляем новое ограничение NoSuspiciousCharacters, чтобы вы могли проверить, что строки не содержат ни одного из этих проблемных символов. Он основан на классе Spoofchecker предоставляемом расширением PHP intl, и работает следующим образом:

// src/Entity/User.php
namespace App\Entity;

use Symfony\Component\Validator\Constraints as Assert;

class User
{
#[Assert\NoSuspiciousCharacters(
// проверяет пробелы нулевой ширины и числа выглядящие одинаково (например 8 и ৪)
checks: NoSuspiciousCharacters::CHECK_INVISIBLE | NoSuspiciousCharacters::CHECK_MIXED_NUMBERS,
restrictionLevel: NoSuspiciousCharacters::RESTRICTION_LEVEL_HIGH,
)
]

private string $username;

#[Assert\NoSuspiciousCharacters]
private string $blogUrl;

// ...
}

Дополнительные материалы

Предыдущая Статья

Новое в Symfony 6.3 — Early Hints

Следующая Статья

Нужно ли комментировать свой код?