0

I'm trying to set cookies. The problem is if I change in browser the cookie username I can log as any user without the password.

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);
}
?>

function user.php

function logged_in () {
  return (isset($_SESSION['user_id']) || isset($_COOKIE['username'])) ? true : false;
}
function login($username, $password) {
  user_id = user_id_from_username($username);
  $username = sanitize ($username);
  $password = md5($password);
  $query = mysql_query("SELECT COUNT('user_id') FROM `users` WHERE username = '$username' AND password = '$password'");
  return (mysql_result($query, 0) == 1) ? $user_id : false;
}

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();
?>

Can anyone help me to secure the cookie? If the user changes the cookie username in the browser, redirect him to index and logout?

4

3 回答 3

1

不要使用 cookie,而是使用$_SESSION一切。只需将用户名存储在会话数组中并检查它是否设置为查看用户是否已登录。为此使用 cookie 的唯一原因是如果您希望会话在多个浏览器会话中持续存在。


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

例如,您创建一个数据库表,其中包含会话 ID、用户名、用户 ID 以及会话到期的时间等。然后您将该会话 ID 设置为 cookie,并且当用户访问您网站上的页面时,您会比较它cookie 中的 id 到您的数据库,以找出该用户是谁。

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

在不相关的说明中,请不要md5()用于密码。这不是它的设计目的,并且可以很快地用表格等打破。crypt()如果可能的话,请研究诸如支持的更安全的算法之类的东西。

于 2013-06-29T18:43:03.657 回答
0

这是错误的:

function logged_in () {

    return (isset($_SESSION['user_id']) || isset($_COOKIE['username'])) ? true : false;
}

似乎没有任何人在他们设置 cookie 后立即登录。

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

function logged_in () {
  return isset($_SESSION['user_id']);
}
于 2013-06-29T18:41:21.460 回答
-2

我使用单个 cookie,但执行类似userid:hash(username+password).

然后检查是否有 cookie

如果 cookie 存在,则提取 user_id 并确保哈希与哈希记录匹配。

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

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

如果您将其加盐并且无法使用它提取密码/用户名,他们应该无法计算出哈希值。

于 2013-06-29T18:41:07.800 回答