调用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
相关产品推荐
相关产品推荐

