登录系统(PHP)Cookie和会话

时间:2009-08-30 17:25:21

标签: php cookies session

我想使用cookies / sessions建立一个登录系统,但我不确定它们的安全性是什么样的。

对于会话,如果“login”设置为“yes”,我可以相信吗?用户是否能够改变它返回的内容?我应该只存储加密密码并在每个页面上进行检查吗?

使用cookies,我是否需要检查mysql注射等内容?

这可能听起来像初学者的东西,但如果有人能为我澄清它会真的有用。提前感谢您的回复!

6 个答案:

答案 0 :(得分:7)

如果设置会话变量,除非用户劫持另一个会话cookie,否则用户无法直接更改它。

您需要注意的是共享托管,您的会话数据不安全(通常其他网站可以看到它)。

值得注意的是,cookie数据也不安全。它不应该依赖于不应该依赖表单数据的方式(无论客户验证告诉你什么)。

您使用密码的最佳做法是:

  1. 以密码形式将密码存储在数据库中,最好是SHA1(第一选择)或MD5(第二选择);
  2. 当您收到用户的密码时,请对其进行加密并根据数据库中存储的内容进行检查;
  3. 在用户会话中设置登录用户名;
  4. 在一段时间后(即使它的日子)过期,而不是让它永远持续;和
  5. 尽可能使用安全连接(HTTPS而非HTTP)。 SSL证书很便宜。

答案 1 :(得分:5)

正如这里有几个人所说,不要相信用户输入。通过清理您的输入,尤其是用户名和&密码字段,有助于抵御SQL注入攻击。

对于所有好的&不要将用户名或密码存储在cookie中,它们会被送回&每次请求都要到服务器上,任何观看流的人都可以抢夺这些数据......然后你就麻烦了。

这里有一些你应该阅读的关于会话,安全性和散列的文章 - 只是将你的密码哈希到SHA1或MD5是不够的,加盐它们以便它们更加强大。没有难以捉摸的安全性 - 即使你做了一切正确的人也可以打破它 - 这是不可避免的。你的工作是让事情尽可能难以打破/利用。

侵入您网站的工作量越多,您的内容就越有价值。你的工作是阻止恶意用户。

本文提供了一些有关为访问者创建唯一指纹的信息,有助于使会话劫持更​​加困难 - PHP Security Guide: Sessions

本文介绍基本密码哈希和&腌制技术 - Password Hashing

这绝不是一个结束所有&做到这一切 - 你可以做一个安全等事业,但他们是一个很好的起点。这里的某人可能会指向更好/更高级的文章,但我个人认为这些文章对我的代码有用。

答案 2 :(得分:3)

经验法则:不要相信用户输入。 Cookie是用户输入,存储在Cookie中的会话ID是用户输入,http标头是用户输入 - 这些必须针对每个可能的事情进行三重检查。另一方面,会话数据存储在您的服务器上,因此如果不存储在/ tmp中,它或多或少是安全的。

会话授权最受欢迎的设置之一是:会话ID存储在cookie中,其他所有内容(包括密码)都存储在会话中。在基于cookie的id启动会话后,您应该从会话数据中获取用户ID,然后检查存储在那里的密码是否仍然有效。

答案 3 :(得分:2)

使用的一个好习惯是存储3个变量。一个用于登录,一个用于他们的用户名,一个用于随机生成的哈希值(当他们登录并与其他用户信息一起存储在数据库中时生成)。这样,如果他们更改了可能存储在Cookie中的用户名,则与用户登录时生成的用户名不匹配。

示例:Cookie数据可能是: logged_in = true; user ='admin'; sessionid = [随机生成的id(我通常只是md5,我创建的一个随机生成的单词)]

每次登录时,都会生成一个新的sessionid并将其存储在数据库中自己的字段中。现在,如果我要更改我的cookie信息并将用户变量更改为“用户”(这可能是另一个用户,他们可能会尝试使用hi-jack)。 sessionid将不再匹配第二个用户的那个,并且登录将被拒绝。

以下是我几周前在一个CI项目中偷走的快速示例:

    function logged(){
$logged_in = $this->session->userdata('logged_in');
if($logged_in){
  $userid = $this->session->userdata('userid');
  $sessionhash = $this->session->userdata('hash');

  $this->db->where('id', $userid);
  $this->db->where('hash', $sessionhash);
  $query = $this->db->get('members');

  if($query->num_rows == 1){
    return TRUE;
  }else{
    return FALSE;
  }
}
}

答案 4 :(得分:0)

任何和所有用户输入都需要仔细检查和消毒,无论是GET和POST数据,cookie数据......

要回答您的问题,如果在会话var中存储登录状态是安全的,答案是肯定的。只要记住清理用户发送给你的一切,无论它应该是多么安全。

答案 5 :(得分:0)

This login system是一个值得学习的好人。