NoSuspiciousCharacters

Дата обновления перевода 2024-07-25

NoSuspiciousCharacters

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

"symfony.com" и "ѕymfony.com" выглядят похоже, но первая буква отличается (во второй строке "s" на самом деле является кириллической строчной буквой dze). Это может заставить пользователя подумать, что он перейдёт на сайт Symfony, тогда как это будет что-то другое.

Это своего рода спуфинг (так называемая "атака омографа IDN"). Она пытается идентифицировать что-то как что-то другое, чтобы использовать возникшую в результате путаницу. Вот почему рекомендуется проверять идентификаторы, предоставленные пользователями, публичные идентификаторы на наличие подозрительных символов, чтобы предотвратить такие атаки.

Поскольку Unicode содержит такое большое количество символов и включает в себя различные системы письма мира, неправильное использование может привести к тому, что приложения или системы будут уязвимыми к возможным атакам на безопасность.

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

??????????? ? ???????? ??? ??????
????? NoSuspiciousCharacters
????????? NoSuspiciousCharactersValidator

Базовое применение

Следующее ограничение будет использовать различные механизмы обнаружения, чтобы гарантировать, что имя пользователя не подделано:

1
2
3
4
5
6
7
8
9
10
// src/Entity/User.php
namespace App\Entity;

use Symfony\Component\Validator\Constraints as Assert;

class User
{
    #[Assert\NoSuspiciousCharacters]
    private string $username;
}

Note

As with most of the other constraints, null and empty strings are considered valid values. This is to allow them to be optional values. If the value is mandatory, a common solution is to combine this constraint with NotBlank.

Опции

checks

тип: integer по умолчанию: all

Эта опция является битовой маской проверок, которые вы хотите выполнить над строкой:

  • NoSuspiciousCharacters::CHECK_INVISIBLE проверяет наличие невидимых символов, таких как пробелы нулевой ширины или последовательности символов, которые, вероятно, не будут выведены, например, несколько повторений одного и того же неразрывного пробела.
  • NoSuspiciousCharacters::CHECK_MIXED_NUMBERS (используется с ICU 58 или выше) проверяет наличие чисел из разных систем исчисления.
  • NoSuspiciousCharacters::CHECK_HIDDEN_OVERLAY (используется с ICU 62 и выше) проверяет объединение символов, скрытых в предыдущем символе.

Вы также можете настроить дополнительные требования с помощью locales и restrictionLevel.

locales

тип: array по умолчанию: framework.enabled_locales

Ограничьте символы строки теми, которые обычно используются в соответствующих языках.

Например, символ "π" будет считаться подозрительным, если вы ограничите локаль до "English", поскольку греческая письменность не связана с английской.

Передача пустого массива или настройка restrictionLevel как NoSuspiciousCharacters::RESTRICTION_LEVEL_NONE отключит это требование.

restrictionLevel

тип: integer по умолчанию: NoSuspiciousCharacters::RESTRICTION_LEVEL_MODERATE в ICU >= 58, иначе NoSuspiciousCharacters::RESTRICTION_LEVEL_SINGLE_SCRIPT

Конфигурирует набор допустимых символов для валидирумой строки через указанный "уровень":

  • NoSuspiciousCharacters::RESTRICTION_LEVEL_MINIMAL требует, чтобы символы строки соответствовали сконфигурированным локалям'.
  • NoSuspiciousCharacters::RESTRICTION_LEVEL_MODERATE также требует, чтобы строка была covered латиницей и любым другим Recommended или Limited Use скриптом, за исключением кириллицы, греческого и чероки.
  • NoSuspiciousCharacters::RESTRICTION_LEVEL_HIGH (используется с ICU 58 или выше) также требует, чтобы строка была covered любым из приведенных ниже наборов скриптов:

    • Латиница + Хань + Бопомофо (или эквивалентно: Latn + Hanb)
    • Латиница + Хань + Хирагана + Катакана (или эквивалентно: Latn + Jpan)
    • Латиница + Хань + Хангуль (или эквивалентно: Latn + Kore)
  • NoSuspiciousCharacters::RESTRICTION_LEVEL_SINGLE_SCRIPT также требует, чтобы строка была single-script.
  • NoSuspiciousCharacters::RESTRICTION_LEVEL_ASCII (используется с ICU 58 или выше) также требует, чтобы символы строки находились в диапазоне ASCII.

Вы можете принять все символы, установив эту опцию как NoSuspiciousCharacters::RESTRICTION_LEVEL_NONE.

groups

type: array | string default: null

It defines the validation group or groups of this constraint. Read more about validation groups.

Дата обновления перевода 2024-07-25

payload

тип: mixed по умолчанию: null

Эта опция может быть использована, чтобы добавить к ограничению произвольные данные, относящиеся к домену. Сконфигурированная нагрузка не используется компонентом Валидатор, но его обработка полностью зависит от вас.

Например, вы можете захотеть исользовать несколько уровней ошибок, чтобы представить неудачные ограничения в фронт-энде по-разному, в зависимости от степени сложности ошибки.