跳到内容

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 或更高版本一起使用)检查隐藏在其前一个字符中的组合字符。

你还可以使用 localesrestrictionLevel 配置其他要求。

区域设置

类型: 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 还要求字符串被拉丁文和任何其他 RecommendedLimited 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 来接受所有字符。

分组

类型: array | string 默认值: null

它定义了此约束的验证组。阅读更多关于 验证组 的信息。

载荷

类型: mixed 默认值: null

此选项可用于将任意特定于域的数据附加到约束。配置的载荷不被 Validator 组件使用,但其处理完全取决于你。

例如,你可能想要使用多个错误级别,以便根据错误严重程度在前端以不同方式呈现失败的约束。

这项工作,包括代码示例,根据 Creative Commons BY-SA 3.0 许可协议获得许可。
目录
    版本