如何针对 XSS 验证 CakePHP 3 字段输入,同时允许文本输入的多种用途?

How can I validate CakePHP 3 field input against XSS, while allowing versatile use for text input?

我目前正在修复 CakePHP 3 应用程序。我在一些允许将标签插入数据库的文本字段中 运行,这将允许用户对系统中的其他用户执行 XSS 攻击。

我想出了以下规则来应用于受影响的 table 对象中存在此问题的字段,以防止将 html 添加到数据库中:

public function validationDefault(Validator $validator)
{
    ...

    $validator
        ->add('description', 'validFormat', [
            'rule' => array('custom', '/^[a-z0-9 ]*$/i'),
            'message' => 'Input must not contain special characters.'
        ]);

    ...
}

然而,这有点限制,不允许在软件的大量实际用例中使用标点符号和特殊字符。

我想实施一个规则,让用户可以最灵活地将文本写入此描述字段,但阻止他们输入能够利用 XSS 漏洞的代码。

这样做的正确规则是什么?这似乎是 Cake 中的一个常见用例,框架中是否有预先存在的规则也可以在没有正则表达式的情况下执行此操作?

我知道将这些字段的输出打印为纯文本是处理此问题的另一种解决方案,我也打算这样做。虽然我也希望在输入端正确格式化数据。

默认情况下,Cake 依赖于您在显示用户输入时对用户输入进行清理,而不是在捕获时进行清理。他们自己的烘焙模板显示他们用 h()、shorthand 包装用户输入值以防止 htmlspecialchars,以防止 XSS:

<td><?= h($example->description) ?></td>

针对 XSS 清理输入充满了潜在的陷阱和复杂性,仅在显示时进行清理要简单得多。它不能真正用 also 不会给您的用户带来不应有的负担的正则表达式行来完成(就像您指出的那样,他们可以使用任何标点符号)。即使提供有限的一组标点符号仍然很危险。

请注意,h() 只能保护您免受基本的 HTML 注入(因此,在上面的示例中已经足够好了)。在放置数据脚本标签和其他 certain circumstances.

时,您仍然需要考虑额外的保护措施