【问题标题】:Checkmarx XSS while using htmlpurifier使用 htmlpurifier 时的 Checkmarx XSS
【发布时间】:2022-04-11 06:25:36
【问题描述】:

我有一个 php 页面,它与以下内容相呼应:

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

这会导致 XSS 问题,我尝试使用 htmlpurifier 通过引用清除 $_REQUEST 的函数来修复该问题,导致此代码:

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


    【解决方案1】:

    清理 HTML 应该是一个非常罕见的要求,而不是您定期对所有输入执行的操作。

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

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

    【讨论】:

    • 很好的答案!为消除歧义,对您的帖子第 4 点的小补充:HTML Purifier 正是这样一个白名单。但是,是的,对于大多数钉子来说,它通常是错误的锤子。 :)
    • @pinkgothic 确实,已编辑 :)
    猜你喜欢
    • 1970-01-01
    • 2021-11-02
    • 2023-01-22
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多