PHP登录会话和cookie

时间:2013-07-05 16:54:10

标签: php session cookies

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

我应该将SESSION变量存储起来?用户名,哈希密码和user ID,或仅user ID?如果我只存储user ID,则有人无法编辑SESSION并更改ID吗?

COOKIE怎么样?我应该只存储user ID吗?据我所知,最终用户可以修改cookie ...

4 个答案:

答案 0 :(得分:20)

您似乎对会话和Cookie没有明确的愿景!

除了您的代码(攻击旁边),没有人可以更改会话内容。因此,您可以存储您需要频繁访问的所有内容(合理),例如user idusername。在cookie中,您必须存储一些模糊信息,以便您以后在用户尝试访问您的页面时识别该信息。所以基于cookie内容你可以重新生成用户会话(即自动重新登录用户)。请注意,用户可以更改cookie内容,因此出于安全原因,它不能像user 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 :)
}

更新:

我写了this article来涵盖这个概念。希望它有所帮助。

答案 1 :(得分:4)

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

在PHP中,您可以使用session_set_cookie_paramssession_name来设置Cookie的参数。

答案 2 :(得分:1)

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

  1. 在用户数据库中创建一个新字段,名称为 X
  2. 生成cookie以保留用户 ID
  3. 生成安全的(说长了) RandomString ,并将其保存在另一个Cookie中。
  4. 也将该随机字符串保存在 X 字段中。
  5. 在成员区域中,检查 ID RandomString 的cookie是否与数据库信息匹配。
  6. 用户注销时清除X列,并在下次登录时为 X 生成数据。

为防止库攻击匹配该随机字符串,您还可以在检查失败或在特定时间内阻止该IP时立即强制注销。

答案 3 :(得分:0)

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

会话变量优势
1)安全
2.)鲁棒

会话缺点 1.)寿命短,直到会话,

会议被破坏了 当用户关闭他的浏览器时 服务器重启 会话使用session_destroy();

销毁

因此会话更安全

另一方面,

Cookie会让您记住用户偏好

如果您使用两者的组合,那么它对您的代码的优势

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

如果它不退出,那么您可以登录用户并在会话中保留信息以及更新cookie。