如果用户更改了unserialize字符串,如何设置新数组

时间:2013-06-22 16:16:14

标签: php

$apply_id=25;

if(isset($_COOKIE['apply'])){$apply_cookie=$_COOKIE['apply'];}
else{$apply_cookie=serialize(array());}

$apply_cookie=unserialize($apply_cookie);

//HAVE COOKIE
if(in_array($apply_id, $apply_cookie)==TRUE){echo "COOKIE=TRUE<BR>"; print_r($apply_cookie);}
else{
    //NO COOKIE,DB HAVE RECORDED
    $db=FALSE;//I don't want to query, so just set TRUE FALSE
    if($db==TRUE){
        echo "COOKIE=FALSE; DB=TRUE";

        $apply_cookie[]=$apply_id;
        $apply_cookie=serialize($apply_cookie);

        setcookie("apply", $apply_cookie);

    }
    else{
        //NO COOKIE,NO RECORDED
        echo "COOKIE=FALSE, DB=FALSE";

        $apply_cookie[]=$apply_id;
        $apply_cookie=serialize($apply_cookie);

        setcookie("apply", $apply_cookie);
            //process the apply query...
    }
}

我已经为我的申请按钮设置了一个cookie,如果用户已申请,它将弹出消息instate再次查询,如果没有cookie,它将检查db并更新cookie。

我将数组(unserialize)存储到cookie中,并使用in_array进行检查。

但是,如果用户尝试更改我的Cookie,则反序列化会出错。

是否可以设置like- if unserialize=FALSE apply_cookie=array();

类似的东西

3 个答案:

答案 0 :(得分:1)

unserialize如果失败则返回false

$apply_cookie = @unserialize($apply_cookie);
if ($apply_cookie === false) {
  $apply_cookie = array();
}

答案 1 :(得分:1)

  

使用@unserialize,函数前面的“@”会使错误沉默

<?php
  $apply_id = 25;
  if ( isset( $_COOKIE["apply"] ) ) {
    $apply_cookie = $_COOKIE["apply"];
  }

  $apply_cookie = ( isset( $apply_cookie ) ) ? @unserialize( $apply_cookie ) : array();
  $apply_cookie = ( is_array( $apply_cookie ) ) ? $apply_cookie : array();

  //HAVE COOKIE
  if ( in_array( $apply_id, $apply_cookie ) ) {
    echo "COOKIE=TRUE<BR>";
    print_r( $apply_cookie );
  }
  else {
    //NO COOKIE,DB HAVE RECORDED
    $db = false;
    if ( $db === true ) {
      echo "COOKIE=FALSE; DB=TRUE";
      $apply_cookie[] = $apply_id;
      $apply_cookie = serialize( $apply_cookie );
      setcookie( "apply", $apply_cookie );
    }
    else {
      //NO COOKIE,NO RECORDED
      echo "COOKIE=FALSE, DB=FALSE";
      $apply_cookie[] = $apply_id;
      $apply_cookie = serialize( $apply_cookie );
      setcookie( "apply", $apply_cookie );
      //process the apply query...
    }
  }
?>

答案 2 :(得分:0)

您应该使用$_SESSION代替$_COOKIE unserialzie用户输入非常危险。

解序列化
http://www.php.net/manual/en/function.unserialize.php

  

警告
  不要将不受信任的用户输入传递给 unserialize()。   反序列化可能导致代码被加载和执行   对象实例化和自动加载,恶意用户也许可以   利用这个。使用安全,标准的数据交换格式,如   如果你需要通过JSON(通过 json_decode() json_encode())   序列化数据给用户。

如果您定义如下类:

<?php

class TestClass {

    public function __destruct() {
        echo '__destruct() called';
    }

}

如果您获得序列化数据:

O:9:"TestClass":0:{}

将显示__destruct() called