Php 登录/Cookie安全

Php 登录/Cookie安全,php,Php,我在试着做饼干。问题是,如果我在浏览器中更改cookie用户名,我可以不使用密码以任何用户的身份登录 login.php <?php if (empty($_POST) === false) { $username = $_POST ['username']; $password = $_POST ['password']; if (empty($username) === true || empty ($password) === true) { $errors []

我在试着做饼干。问题是,如果我在浏览器中更改cookie用户名,我可以不使用密码以任何用户的身份登录

login.php

<?php
if (empty($_POST) === false) {
  $username = $_POST ['username'];
  $password = $_POST ['password'];
  if (empty($username) === true || empty ($password) === true) {
    $errors [] = 'er1';
  } else if (user_exists($username) === false) {
    $errors [] = 'er2';
  } else {
    $login = login($username, $password);
    if ($login === false) {
      $errors [] = 'er3';
    } else {
      setcookie("username", $username,  time()+3600*24*30);
      $_SESSION['user_id'] = $login;
      header('Location: logged_in.php');
      exit();
    }
  }
}
if (empty($errors) === false) {
  echo output_errors($errors);
}
?>
core init.php

<?php
ob_start();
session_set_cookie_params(3600*24*30, "/");
session_start();
//error_reporting(0);
require 'database/connect.php';
require 'functions/general.php';
require 'functions/users.php';
if (logged_in() === true) {
  $session_user_id = $_SESSION['user_id'];
  $user_data = user_data($session_user_id, 'user_id', 'password', 'username', 'email', 'age', 'gender', 'country', 'city', 'image_id');
}
$errors = array();
?>


谁能帮我把饼干拿好吗?如果用户在浏览器中更改cookie用户名,请将其重定向到索引并注销?

我使用单个cookie,但执行类似于
userid:hash(用户名+密码)
的操作

然后检查一下有没有饼干

如果cookie存在,则提取用户id,并确保哈希与哈希记录匹配

如果没有,请删除cookie并阻止id

他们可以更改id,但是如果他们不能匹配用户名/密码哈希,这对他们没有好处

如果你对哈希进行了很好的腌制,并且不能使用它提取密码/用户名,那么他们应该无法计算出哈希值。

这是错误的:

function logged_in () {

    return (isset($_SESSION['user_id']) || isset($_COOKIE['username'])) ? true : false;
}
没有任何人在设置cookie后立即登录

您至少应该使用
&&
而不是
| |
,但是您的登录确实不需要依赖cookie数据(=用户提供的数据…),因此您应该只使用:

function logged_in () {
  return isset($_SESSION['user_id']);
}

使用
$\u SESSION
代替cookies。只需将用户名存储在会话数组中,并检查它是否设置为查看用户是否已登录。。使用cookies的唯一原因是,如果您希望会话在多个浏览器会话中保持不变


如果必须使用cookie而不是将用户名存储在cookie中,请存储随机生成的唯一会话ID(即20个字符+随机字符串),并将其与数据库中的会话数据相匹配

例如,您创建了一个数据库表,其中包含会话id、用户名、用户id和会话过期时间等。然后将该会话id设置为cookie,当用户访问站点上的某个页面时,您将cookie中的id与数据库进行比较,以找出该用户是谁

这比存储用户名安全得多,因为在会话到期之前,很可能有人能够猜出一个20多个字符的随机字符串


另外,请不要使用
md5()
作为密码。这不是它的设计目的,可以很快用桌子等打破。如果可能的话,研究一下
crypt()
支持的更安全的算法。

不要设置比会话已经自动执行的更多的cookie。只需删除您自己的cookie并使用会话数据。除非您有特定的原因和安全加密方法,否则不要将敏感数据放入cookie中。会话(轮流使用cookie)是为存储敏感数据而设计的,cookie绝对不是。我需要cookie只是为了视频聊天自动登录authz我希望我可以只去sessionsthx来回答为什么我需要cookie用户名只是为了我的视频聊天自动登录im使用此代码so.addVariable(“uid”);要从cookie中获取用户并登录到视频聊天,我可以选择会话,但它不起作用//会话/基于cookie的授权(自动登录)if($\u会话['user\u id']!=“”){$sql=“SELECT*from users WHERE user\u id=””。“;}//非会话/基于cookie的自动登录授权,如果($uid!=“”){$sql=“从username='”的用户中选择*。$_GET['uid']。““;}否则{echo';exit;}这是我的错误,看起来不需要这么做。我做得不太好。你能再解释一下吗?
function logged_in () {
  return isset($_SESSION['user_id']);
}