NoSuspiciousCharacters
验证给定的字符串是否不包含用于欺骗性安全攻击的字符,例如零宽度空格等不可见字符或视觉上相似的字符。
"symfony.com" 和 "ѕymfony.com" 看起来很相似,但它们的第一个字母不同(在第二个字符串中,“s”实际上是一个西里尔字母 dze)。这可能会让用户认为他们将导航到 Symfony 的网站,而实际上会是其他地方。
这是一种欺骗攻击(称为“IDN 同形字攻击”)。它试图将某物识别为其他事物,以利用由此产生的混淆。这就是为什么建议检查用户提交的、面向公众的标识符中是否存在可疑字符,以防止此类攻击。
由于 Unicode 包含如此大量的字符,并融入了世界各地不同的书写系统,因此不正确的使用可能会使程序或系统面临可能的安全攻击。
这就是为什么此约束确保字符串或 Stringable 对象不包含任何可疑字符。由于它利用了 PHP 的 Spoofchecker,因此必须启用 intl 扩展才能使用它。
基本用法
以下约束将使用不同的检测机制来确保用户名不被欺骗
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;
}
注意
与其他大多数约束一样,null
和空字符串被视为有效值。这是为了允许它们成为可选值。如果该值是强制性的,一个常见的解决方案是将此约束与 NotBlank 结合使用。
选项
检查
类型: integer
默认值: all
此选项是你想要对字符串执行的检查的位掩码
NoSuspiciousCharacters::CHECK_INVISIBLE
检查是否存在不可见字符,例如零宽度空格,或可能不显示的字符序列,例如同一非间距标记的多次出现。NoSuspiciousCharacters::CHECK_MIXED_NUMBERS
(可与 ICU 58 或更高版本一起使用)检查来自不同编号系统的数字。NoSuspiciousCharacters::CHECK_HIDDEN_OVERLAY
(可与 ICU 62 或更高版本一起使用)检查隐藏在其前一个字符中的组合字符。
你还可以使用 locales 和 restrictionLevel 配置其他要求。
区域设置
类型: array
默认值: framework.enabled_locales
将字符串的字符限制为通常与关联语言一起使用的字符。
例如,如果你将区域设置限制为“英语”,则字符“π”将被视为可疑字符,因为希腊文字与英语无关。
传递一个空数组,或将 restrictionLevel 配置为 NoSuspiciousCharacters::RESTRICTION_LEVEL_NONE
将禁用此要求。
限制级别
类型: integer
默认值: 在 ICU >= 58 上为 NoSuspiciousCharacters::RESTRICTION_LEVEL_MODERATE
,否则为 NoSuspiciousCharacters::RESTRICTION_LEVEL_SINGLE_SCRIPT
通过指定的“级别”配置已验证字符串的可接受字符集
NoSuspiciousCharacters::RESTRICTION_LEVEL_MINIMAL
要求字符串的字符与配置的 locales' 匹配。NoSuspiciousCharacters::RESTRICTION_LEVEL_MODERATE
还要求字符串被拉丁文和任何其他 Recommended 或 Limited Use 脚本覆盖,除了西里尔文、希腊文和切罗基文。NoSuspiciousCharacters::RESTRICTION_LEVEL_HIGH
(可与 ICU 58 或更高版本一起使用)还要求字符串被以下任何一组脚本覆盖- 拉丁文 + 汉字 + 注音符号 (或等效地: Latn + Hanb)
- 拉丁文 + 汉字 + 平假名 + 片假名 (或等效地: Latn + Jpan)
- 拉丁文 + 汉字 + 韩文 (或等效地: Latn + Kore)
NoSuspiciousCharacters::RESTRICTION_LEVEL_SINGLE_SCRIPT
还要求字符串是单脚本的。NoSuspiciousCharacters::RESTRICTION_LEVEL_ASCII
(可与 ICU 58 或更高版本一起使用)还要求字符串的字符在 ASCII 范围内。
你可以通过将此选项设置为 NoSuspiciousCharacters::RESTRICTION_LEVEL_NONE
来接受所有字符。