Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php中的安全会话/cookie_Php_Session_Cookies - Fatal编程技术网

php中的安全会话/cookie

php中的安全会话/cookie,php,session,cookies,Php,Session,Cookies,我有一个关于会议的问题。如何创建安全的登录会话/cookie。 我在看这个例子,他们将这个数组添加到会话中: $data = array{ username = $_POST['username']; is_logged = true; } 我想知道这是否足够?无法将cookie中的用户名更改为任何内容或任何人吗?有什么好办法可以解决这个问题 或者这是完全安全的,我错过了什么 另外,你们觉得在数据库中存储会话怎么样?我知道tha CI有一个内置的功能来实现这一点。这会导致性

我有一个关于会议的问题。如何创建安全的登录会话/cookie。 我在看这个例子,他们将这个数组添加到会话中:

$data = array{

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

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

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


另外,你们觉得在数据库中存储会话怎么样?我知道tha CI有一个内置的功能来实现这一点。这会导致性能方面的问题吗,或者值得启用吗?

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

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


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

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

一旦访问者每次请求顶部有
session\u start()
的页面时都有一个活动会话,
session\u start()
将查看名为PHPSESSID的cookie请求,读取服务器端会话文件(如果会话存在且有效)并还原已归档的
$\u session
数组。此阵列永远不需要离开服务器

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

安全会话的路径:

  • 确保仅使用cookies将会话id传递到浏览器设置
    会话。使用\u cookies=1
    会话。仅使用\u cookies=1
    会话。使用\u trans\u id=0
    (我将为您提供备用语法的详细信息)
  • 防止会话劫持(即其他人伪造现有会话)将识别浏览器的内容存储到$\u会话中-一种常见模式是存储浏览器的用户代理头、接受头、远程IP地址或其组合的
    md5()
    ;检查它是否在每个新请求时与现有会话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;

我无法从您的代码片段中理解您到底在做什么。我正在将$data数组传递给会话,以便会话使用它创建cookie。但这看起来不安全,我想知道如何使其安全…你的意思是,例如,当我将用户ID发送到cookie时,我应该对其应用md5函数,还是应该在生成哈希时使用某种密钥,以便恢复用户ID?非常感谢。您应该生成一些不可预测的内容,否则恶意用户可能会不断生成具有不同用户ID的值并对其进行散列。您可以生成一个[userID][一些随机数据]形式的字符串,然后对其进行散列。可以使用PHP的uniqid()函数生成随机数据。那样你就很安全了。谢谢,你说得对,我把会话和饼干混淆了!解释得很清楚!