如何针对 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 中的常见用例,框架中是否有一个预先存在的规则可以在不使用正则表达式的情况下执行此操作?


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


小怪兽爱吃肉
浏览 86回答 1
1回答

蝴蝶不菲

默认情况下,Cake 依赖于您在显示用户输入时(而不是捕获用户输入时)对其进行清理。他们自己的烘焙模板显示,他们使用h()( 的简写)包装用户输入值htmlspecialchars,以防止 XSS:<td><?= h($example->description) ?></td>针对 XSS 清理输入充满了潜在的陷阱和复杂性,仅清理显示的内容要简单得多。它实际上不能用一行正则表达式来完成,也不会给您的用户带来过度的负担(正如您所指出的,这样他们就可以使用任何标点符号)。即使提供一组有限的标点符号仍然可能很危险。请注意,h()这只可以保护您免受基本的 HTML 注入(因此,在上面的示例中已经足够好了)。在放置数据脚本标签和其他某些情况时,您仍然需要考虑额外的保护。
打开App,查看更多内容
随时随地看视频慕课网APP