PHP-php中如何保证cookie安全

小组事务管理 小组事务管理 主题:974 回复:1955

PHP-php中如何保证cookie安全

晚风撩人 发布于 2017-07-11 字数 323 浏览 1055 回复 3

可能重复的问题
怎样加强cookie安全?

服务端中下cookie,客户端把它带回来,形成标记。但是传回服务端的cookie如何保证它是正确的,而没有被恶意修改.
有人提出了利用ip进行绑定设定cookie。
问问大家还有没有好的作法

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(3

瑾兮 2017-10-24 3 楼

安全永远是相对的,客户端被抓包破解是难免的,如果做不到像银行系统那样有自己的客户端插件,生成密匙和存储信息,那就自己一套加密解密算法,同时不定期的变换规则。建议参考discuz加密方法:利用FORMHASH,每次提交都不一样,精确到微妙

清晨说ぺ晚安 2017-09-09 2 楼

介绍一种方式,可以用动态私钥保证Cookie中数据的安全

用户登录认证为例,用户登录以后产生如下的几个cookie:
userid
username
time
security

$userid = 999;
$username = 'test';
$time = time();
setcookie('userid', $userid, 2592000);
setcookie('username, $username, 2592000);
setcookie('time', $time, 2592000);

$security = sprintf("%s|%s|%s", $userid, $username, $time);

生成16位的私钥,生成的私钥可以保存在cookie里面,也可以保存在memcached里面(或其它的NoSQL),为了让系统更安全,保存在memcached里面会更好些,私钥的有效期可以设置长一些,比如一年等,如果memcached中存在某个用户的私钥,则从里面取出,否则生成新的私钥,再保存在memcached中。

因为每个用户第一次登录或注册的时候私钥都是空的,因此会随机生成一个私钥并且保存在memcached中,由于是随机生成的,因此每个用户的私钥是不相同的,这样保证系统更加安全,别人很难猜测出来。也可以这样,不管在memcached中的私钥是否失效,每次登录的时候随机生成一个私钥然后再保存在memcached中,这样每个人自己的私钥也是动态变化的,更加安全。

$memcached = new Memcache;
$memcached->connect('localhost', 11211);

$key = 'key_' . $userid;
$privateKey = $memcached->get($key);
if (empty($privateKey) {
$privateKey = random(16);
$memcached->set($key, $privateKey);
}

$security = xxtea::encrypt($security, $privateKey);
setcookie('security', $security, 2592000);

 /**

  • 生成随机数
  • @param int $length 生成的随机数的长度
  • @param int $numeric 是否生成数字随机数的标志
    /
    function random($length, $numeric = 0) {
    PHP_VERSION < '4.2.0' && mt_srand((double)microtime()
    1000000);
    if ($numeric) {
    $begin = pow(10, $length - 1);
    $end = pow(10, $length) - 1;
    $hash = sprintf('%0'.$length.'d', mt_rand($begin, $end));
    } else {
    $hash = '';
    $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
    $max = strlen($chars) - 1;
    for($i = 0; $i < $length; $i++) {
    $hash .= $chars[mt_rand(0, $max)];
    }
    }
    return $hash;
    }

怎样判断用户是否已经登录了呢?过程大致如下:

 function isLogin() {
global $memcached;
$privateKey = $memcached->get($key);
//如果私钥是空的,则解密数据,因此认识用户是没有登录的
if (empty($privateKey)) return false;

$security = xxtea::decrypt($_COOKIE['security'], $privateKey);
$vals = explode('|', $security);

if ($COOKIE['userid'] == $vals[0] &amp;&amp; $COOKIE['username'] == $vals[1] &amp;&amp; $COOKIE['time'] == $vals[2]) {
    return true;
} else {
    return false;
}

}

只要不知道用户的私钥,即使知道解密的算法,也很难破解数据,也就是说,上述这几个cookie中的值是无法伪造的,主要是名为security的cookie中的值是无法伪造的,这样基本上就不能模拟用户登录了。

清晨说ぺ晚安 2017-09-04 1 楼

看下discuz的cookie加密解密方法吧