Checkmarx XSS同时使用htmlpurifier

Checkmarx XSS while using htmlpurifier

提问人: 提问时间:4/10/2022 更新时间:4/11/2022 访问量:351

问:

我有一个 php 页面,它回显如下:

echo "<div>" . $_REQUEST["id"] . "</div>";

这导致了 XSS 问题,我试图通过引用清理 $_REQUEST 的函数使用 htmlpurifier 修复该问题,从而导致以下代码:

function sanitizer(array &array) {
   foreach ($array as $key => $value) {
            $array[$key] = htmlpurifierInstance->purify($value);
   }
}

sanitizer($_REQUEST);

echo "<div>" . $_REQUEST["id"] . "</div>";

在另一次checkmarx测试后,问题仍然弹出,这个问题的解决方法是什么?

php xss htmlpurifier checkmarx

评论


答:

0赞 IMSoP 4/10/2022 #1

清理 HTML 应该是一个非常罕见的要求,而不是你经常在所有输入上做的事情。

  1. 每当某个值的有效值范围有限时,请对其进行验证。如果它无效,请拒绝它或取消设置它。因此,如果“id”应该是一个数字,则拒绝非数字输入。
  2. 每当在某处输出或发送任何变量时,请将其转义为相关上下文。在本例中,您是在 HTML 上下文中输出,因此请使用 .这不是您可以提前执行的操作,因为同一变量可能会在多个上下文中使用。htmlspecialchars
  3. 对于数据库查询的特定情况,不要使用转义,而使用参数化查询。
  4. 在极少数情况下,您确实需要用户能够输入 HTML,请提出一个严格的标签和属性白名单,并根据该白名单清理特定变量,作为输入处理的一部分。(这就是 HTMLPurifier 的用途。

永远不要尝试编写“通用”清理或转义函数。充其量,您最终会通过一次应用太多东西来破坏数据;在最坏的情况下,你会破坏自己的安全。

评论

0赞 pinkgothic 4/11/2022
很好的答案!为了消除歧义,对您帖子的要点 #4 进行了小补充:HTML Purifier 就是这样一个白名单。但是,是的,对于大多数钉子来说,它通常是错误的锤子。:)
0赞 IMSoP 4/11/2022
@pinkgothic确实,编辑:)