我想为来自各种来源的数据建立一个通用的 sanitizer 程序。清理我的意思是(在这个阶段)将 htmlspecialchars 应用于字符串。现在,来自这些来源的数据可以是任何东西,从对象到数组再到字符串,都是嵌套的(而且很复杂),而且格式总是有点不同。
所以我想到了一个递归的 htmlspecialchars 函数,它将自身应用于数组和对象,并且只将 htmlspecialchars 应用于字符串,但是我如何递归地遍历一个对象呢?
谢谢。
编辑:我想我应该提到这一点——我实际上正在构建一个严重依赖 JS 和 JSON 进行客户端-服务器通信的 RIA。服务器唯一要做的就是从数据库中获取内容并通过 JSON 将其返回给客户端,格式如下:
{"stat":"ok","data":{...}}
正如我所说,数据可以是任何东西,不仅来自数据库的字符串形式,还可以来自 XML 处理JSON的工作流程如下:
- 从 DB/XML 中获取数据(源编码为 iso-8859-1)
将它们放入“数据”数组
使用递归方式将 iso-8859-1 转换为 utf-8
private function utf8_encode_deep(&$input) { if (is_string($input)) { $input = $this -> str_encode_utf8($input); } else if (is_array($input)) { foreach ($input as &$value) { $this -> utf8_encode_deep($value); } unset($value); } else if (is_object($input)) { $vars = array_keys(get_object_vars($input)); foreach ($vars as $var) { $this -> utf8_encode_deep($input -> $var); } } }
使用PHP的
json_encode
将数据转成JSON向客户端发送(回显)数据
使用 JS 呈现数据(例如放入表格)
在这两者之间的某个地方,数据应该以某种方式被净化(在这个阶段只有 htmlspecialchars)。现在的问题应该是:在哪里 sanitizer ,使用什么方法?
最佳答案
你可以试试下面的方法
class MyClass {
public $var1 = '<b>value 1</b>';
public $var2 = '<b>value 2</b>';
public $var3 = array('<b>value 3</b>');
}
$list = array();
$list[0]['nice'] = range("A", "C");
$list[0]['bad'] = array("<div>A</div>","<div>B</div>","<div>C</div>",new MyClass());
$list["<b>gloo</b>"] = array(new MyClass(),"<b>WOW</b>");
var_dump(__htmlspecialchars($list));
使用的函数
function __htmlspecialchars($data) {
if (is_array($data)) {
foreach ( $data as $key => $value ) {
$data[htmlspecialchars($key)] = __htmlspecialchars($value);
}
} else if (is_object($data)) {
$values = get_class_vars(get_class($data));
foreach ( $values as $key => $value ) {
$data->{htmlspecialchars($key)} = __htmlspecialchars($value);
}
} else {
$data = htmlspecialchars($data);
}
return $data;
}
输出类似
array
0 =>
array
'nice' =>
array
0 => string 'A' (length=1)
1 => string 'B' (length=1)
2 => string 'C' (length=1)
'bad' =>
array
0 => string '<div>A</div>' (length=24)
1 => string '<div>B</div>' (length=24)
2 => string '<div>C</div>' (length=24)
3 =>
object(MyClass)[1]
...
array
0 =>
object(MyClass)[2]
public 'var1' => string '<b>value 1</b>' (length=26)
public 'var2' => string '<b>value 2</b>' (length=26)
public 'var3' =>
array
...
关于PHP:对象上的递归htmlspecialchars,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12713702/