首页 > 解决方案 > 如何针对 XSS 验证 CakePHP 3 字段输入,同时允许文本输入的多种用途?

问题描述

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

我提出了以下规则,适用于受影响的表对象中存在此问题的字段,以防止将 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 中的一个常见用例,框架中是否有预先存在的规则可以在没有正则表达式的情况下执行此操作?

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

标签: phpvalidationcakephpcakephp-3.0xss

解决方案


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

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

针对 XSS 对输入进行清理充满了潜在的陷阱和复杂性,仅在显示上清理要简单得多。使用一行不会给您的用户带来过度负担的正则表达式实际上无法做到这一点(就像您指出的那样,他们可以使用任何标点符号)。即使提供一组有限的标点符号仍然是危险的。

请注意,h()这只保护您免受基本的 HTML 注入(因此,在上面的示例中已经足够好了)。在放置数据脚本标签和其他特定情况时,您仍然需要考虑额外的保护措施。


推荐阅读