如何针对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中的一个常见用例,在没有regex的情况下,框架中是否有预先存在的规则可以做到这一点?

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

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

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

针对XSS对输入进行消毒充满了潜在的陷阱和复杂性,只在显示器上进行消毒要简单得多。这真的不可能用一行正则表达式来完成,不会给用户带来不必要的负担(正如您所指出的,他们可以使用任何标点符号(。即使提供一套有限的标点符号也可能是危险的。

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

最新更新