You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用Functions类sanitizeArray方法无法净化多维数组值的问题

问题分析与解决

你的问题核心是PHP数组的传参机制导致的:

问题根源

PHP中数组作为函数参数默认是值传递——当你把$data传给sanitizeArray方法时,方法内部会创建一个原数组的副本,你在方法里对数组的所有修改都只作用于这个副本,原数组完全没被改动。

而你直接在Data类里处理时,操作的是原数组本身(并且用了引用&$value、&$val来修改数组元素),所以净化逻辑能生效。

两种解决方案

方案1:使用引用传参

修改sanitizeArray的参数为引用类型,让方法直接操作原数组:

class Functions {
    public static function sanitize($value){ 
        return htmlentities($value, ENT_QUOTES, 'UTF-8');
    }

    public static function sanitizeArray(&$data){ // 参数前添加&,改为引用传参
        foreach ($data as &$value) {
            foreach ($value as $key_1 => &$val) {
                $val = self::sanitize($val);                
            }
        }
    }
}

// Data类中调用无需改动,直接生效:
Functions::sanitizeArray($this->data);

方案2:返回处理后的数组

让sanitizeArray返回处理完成的数组,在Data类中用返回值覆盖原数组:

class Functions {
    public static function sanitize($value){ 
        return htmlentities($value, ENT_QUOTES, 'UTF-8');
    }

    public static function sanitizeArray($data){
        foreach ($data as &$value) {
            foreach ($value as $key_1 => &$val) {
                $val = self::sanitize($val);                
            }
        }
        return $data; // 返回处理后的数组
    }
}

// Data类中调用时接收返回值:
$this->data = Functions::sanitizeArray($this->data);

额外注意

你代码里的数组定义存在语法错误:字符串中的单引号没有转义,比如'<script>alert('XSS !!');</script>'会导致PHP解析失败,需要改成'<script>alert(\'XSS !!\');</script>'或者用双引号包裹字符串。

内容的提问来源于stack exchange,提问作者Robert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 08:18:35