繁体   English   中英

在php中安全会话/ cookie

[英]secure sessions/cookies in php

我对会话有疑问。 你如何建立一个安全的登录会话/ cookie。 我在看这个例子,他们将这个数组添加到会话中:

$data = array{

    username = $_POST['username'];
    is_logged = true;

}

我想知道这是否足够? 是不是可以将cookie中的用户名更改为任何内容或任何人? 有什么好办法可以解决这个问题?

或者这是完全安全的,我错过了什么?

另外,你们怎么看待在数据库中存储会话? 我知道CI有一个内置功能来做到这一点。 这会导致任何性能方面的问题,还是值得鼓励?

我相信你误解了PHP会话应该如何工作。 您可以安全地将用户名,登录状态和其他内容存储到$_SESSION数组中,因为它存储在服务器端。 发送到浏览器的唯一事情是一个cookie(名为PHPSESSID,除非你在php.ini更改了它)包含会话ID - 这是一个唯一的随机数。

一旦访问者在每次请求顶部都有session_start()的页面时都有活动会话, session_start()将查看名为PHPSESSID的cookie的请求,读取服务器端会话文件(如果会话存在且有效)并恢复提交的$_SESSION数组。 这个数组永远不需要离开服务器。

会话cookie的设置没有到期日期(除非你弄乱了php.ini中的session.cookie_lifetime选项),因此浏览器会在关机时删除它。 服务器上的会话文件本身有一个到期时间,由session.gc_maxlifetime (以秒为单位)管理。

更安全会话的途径:

  • 确保只使用cookie将会话ID传递给浏览器设置session.use_cookies=1session.use_only_cookies = 1session.use_trans_id = 0 (我将为您提供备用语法的详细信息)
  • 防止会话劫持(即其他人假装现有会话)存储到$ _SESSION标识浏览器的东西 - 一种常见的模式是存储浏览器的User-Agent标头的md5() ,Accept标头,远程IP地址或这些组合; 检查每个具有现有会话ID的新请求是否匹配
  • 如果你在共享服务器上,你确实应该将你的会话文件与服务器邻居的文件分开:将session.save_path设置为只有你和PHP有权访问的文件夹。

最后,您应该创建一个脚本来将用户注销会话(并鼓励他们使用它而不是简单地导航)。 这是一个示例脚本:

<?php
  session_start();
  $params = session_get_cookie_params();
  setcookie(session_name(), '', 1, $params['path'], $params['domain'], $params['secure'], isset($params['httponly']));
  session_regenerate_id(true);
  session_destroy();
  session_write_close();
  header('Location: your_login_page.php');
  exit;

是的,这是一种非常不安全的方法,如果你想阻止会话劫持,不应该在任何地方使用它。

更鲁棒的方法是在用户登录时为用户生成唯一的会话ID(例如,散列),并将会话与该ID服务器端相关联。 然后仅将cookie中的此会话ID发送回客户端。 当客户端使用cookie发送请求时,您将获取会话ID并恢复用户名以及与其相关的任何其他信息以进行请求处理。

客户端可以访问cookie中的会话ID,但是这个值对他来说没有意义,因为他无法从中推断出任何信息,并且发送随机会话ID几乎没有成功的机会。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM