PHP登录会话和cookie

PHP登录会话和cookie,php,session,cookies,Php,Session,Cookies,在我的PHP网站上,用户可以登录并有可能选中“记住我”来设置cookie 我应该将什么存储为会话变量?用户名、哈希密码和用户ID,还是仅用户ID?如果我只存储用户ID,是否有人可以编辑会话并更改ID 那么COOKIE呢?我应该只存储用户ID?据我所知,最终用户可以修改cookie…您应该将随机会话值存储在cookie中。您绝对不应该在cookie本身中存储关于用户的任何信息。然后,您可以在每次页面加载时检查cookie中的会话id,以确保(a)用户应有权访问该内容,以及(b)会话id有效 在PH

在我的PHP网站上,用户可以登录并有可能选中“记住我”来设置cookie

我应该将什么存储为
会话
变量?用户名、哈希密码和
用户ID
,还是仅
用户ID
?如果我只存储
用户ID
,是否有人可以编辑
会话
并更改ID


那么
COOKIE
呢?我应该只存储
用户ID
?据我所知,最终用户可以修改cookie…

您应该将随机会话值存储在cookie中。您绝对不应该在cookie本身中存储关于用户的任何信息。然后,您可以在每次页面加载时检查cookie中的会话id,以确保(a)用户应有权访问该内容,以及(b)会话id有效


在PHP中,您可以使用
session\u set\u cookie\u params
session\u name
来设置cookie的参数。

您似乎对会话和cookie没有清晰的认识

除了您的代码(除了攻击之外),任何人都不能更改会话内容。因此,您可以存储您需要经常访问的所有内容(合理),如
用户id
用户名
。在Cookie中,您必须存储一些模糊信息,以便在用户稍后尝试访问您的页面时识别这些信息。因此,基于cookie内容,您可以重新生成用户会话(即自动重新登录用户)。请注意,用户可以更改Cookie内容,因此出于安全原因,它不能是像
用户id
这样简单的内容

我只是给你一个简单的例子,它远不是完美的,但也不是那么糟糕!您可能需要根据您的场景进行调整:

在这里,您可以创建如下cookie内容:

$salt = substr (md5($password), 0, 2);
$cookie = base64_encode ("$username:" . md5 ($password, $salt));
setcookie ('my-secret-cookie', $cookie);
稍后要重新登录用户,请执行以下操作:

$cookie = $_COOKIE['my-secret-cookie'];
$content = base64_decode ($cookie);
list($username, $hashed_password) = explode (':', $hash);

// here you need to fetch real password from database based on username. ($password)
if (md5($password, substr(md5($password), 0, 2)) == $hashed_password) {
    // you can consider use as logged in
    // do whatever you want :)
}
更新:


我写的这篇文章涵盖了这个概念。希望有帮助。

用户无法编辑会话变量,这些变量在服务器上管理

会话可变优势
1.)安全
2.)稳健

会话劣势 1.)生命周期短,直到会话存在

会话被破坏
当用户关闭浏览器时 服务器重启
使用session_destroy()销毁会话

所以会话更安全

另一方面,Cookie可以让您记住用户优先级

如果您将两者结合使用,那么它对您的代码是有利的

You can store userid and username in cookie, then verify user identity using its combination.

若它并没有退出,那个么你们可以登录用户并在会话中保存信息以及更新cookie

对于可能更喜欢使用cookie的用户(因此即使浏览器关闭,您也可以在很长时间后访问),这是一种在cookie中存储粗略ID的安全方法:

  • 在用户数据库中创建一个新字段,将其命名为X
  • 生成cookie以保留用户ID
  • 生成一个安全的(比如long)随机字符串,并将其保存在另一个cookie中
  • 还将该随机字符串保存在X字段中
  • 在“成员”区域中,检查ID为IDRandomString的cookie是否与数据库信息匹配
  • 用户注销时清除列X,并在下次登录时为X生成数据

  • 为了防止库攻击匹配该随机字符串,您还可以在检查失败或阻止该IP一段时间后强制注销。

    感谢您的澄清;您能否给出使用cookies重新登录用户的最佳实践?我不知道如何继续…检查更新!代码是动态编写的!因此,如果你看到打字错误或bug,我很抱歉,请尝试修复它或告诉我问题。谢谢,这似乎是一个很好的方法。你觉得这个怎么样?我觉得很好。但是它过时了吗?这并不是那么糟糕,但是考虑在那个解决方案中,你需要存储他在DB中提到的随机数。它比我的解决方案更强大,因为你可以创建真正好的随机数来避免暴力攻击。使用您的常识,选择您认为更适合您的程序上下文的内容。您正在使用md5隐藏密码。不管什么原因,都不要这样做。通常最好为“记住我”cookie创建一个完全随机的值,并将其存储为用户帐户的备用密码。这样,它甚至比通常的密码更随机,并且没有人可以使用该值对密码进行反向工程。