0
点赞
收藏
分享

微信扫一扫

php中serialize序列化缺陷


//序列化一个数组:
serialize(array("asdoasod\'asdasd", "asdaspdaso\\\\\\pdopasopd"));
//返回结果:
a:2:{i:0;s:16:"asdoasod\'asdasd";i:1;s:22:"asdaspdaso\\\pdopasopd";}
//我们一般存进数据库,带\号直接存进数据库会有一个问题,会出现自动去除'\'
//假如去除了'\'
//s:16: 这个16代表长度
//再从数据库中取出来数据,s:16的长度将会变短,这个时候:
unserialize(); //就会出现问题!

网友给出的解决方案

方案1:

/**
* 将字符串转换为数组
*
* @param string $data 字符串
* <a href="" target="_blank" rel="nofollow">@return</a> array 返回数组格式,如果,data为空,则返回空数组
*/
function string2array($data) {
if($data == '') return array();
@eval("\$array = $data;");
return $array;
}
/**
* 将数组转换为字符串
*
* @param array $data 数组
* @param bool $isformdata 如果为0,则不使用new_stripslashes处理,可选参数,默认为1
* <a href="" target="_blank" rel="nofollow">@return</a> string 返回字符串,如果,data为空,则返回空
*/
function array2string($data, $isformdata = 1) {
if($data == '') return '';
if($isformdata) $data = new_stripslashes($data);
return addslashes(var_export($data, TRUE));
}

方案2:

PDO::prepare()
或者
base64_encode(json_encode($array));

方案3:

用 htmlspecialchar() 处理一下在系列化

如果遇到此问题你的解决方案是什么呢,欢迎留言讨论!

举报

相关推荐

0 条评论