2013-07-05 248 views
4

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

我该如何储存SESSION变量?用户名,散列密码和user ID,或只有user ID?如果我只存储user ID,那么是否有人可以编辑SESSION并更改ID?

那么COOKIE呢?我应该只储存user ID吗?据我所知,cookies可以由最终用户修改...

回答

17

看起来你对会话和cookies没有清晰的认识!

没有人可以改变会议内容,除了你的代码(在攻击旁边)。因此,您可以存储需要频繁访问的所有内容(合理的),例如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); 

// and later to re-login user you do: 
$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 :) 
} 

UPDATE:

我写this article覆盖这个概念。希望能帮助到你。

+0

感谢您的澄清;你能否给出使用cookies重新登录用户的最佳做法?我无法弄清楚我将如何继续...... –

+0

检查更新!该代码即时写入!所以如果你看到错字或错误,我很抱歉,尝试修复它或告诉我的问题 – Boynux

+0

谢谢,这似乎是一个好方法。你对此有何看法:http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/?对我来说似乎很好。但它过时了吗? –

4

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

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

0

用户不能编辑会话变量,它们在服务器上进行管理。

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

会话缺点 1。)寿命短的时间,直到会话中,

会议被摧毁
当用户关闭他的浏览器 服务器重启
会话中使用session_destroy销毁();

所以会更安全

饼干,另一方面让你记住用户prefrences

如果使用两者的结合,那么它的优势,你的代码

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

如果它不是退出然后您可以登录用户并保持会话中的信息以及更新cookie。