2011-11-11 236 views
0

我有我的网站使用cookie登录和注销,它似乎工作正常,但我相信有一些安全问题,我不知道。我希望任何意见或见解能够使这一点更加安全。网站登录和注销

登录:

if(isset($_REQUEST['email']) && isset($_REQUEST['password'])) { 
    if ($result = $usersqli->query("SELECT * FROM users WHERE email='".$usersqli->real_escape_string($_POST['email'])."' AND password='".$usersqli->real_escape_string($_POST['password'])."'")) { 
     if ($result->num_rows==1){ 
      $row = $result->fetch_object(); 
      $_SESSION["uid"]=$row->id; 
      setcookie('email', $usersqli->real_escape_string($_REQUEST['email']), time()+60*60*24*365,'/'); 
      setcookie('password', md5($_REQUEST['password']), time()+60*60*24*365,'/'); 
      $usersqli->query("UPDATE users SET last_login=NOW() WHERE email='".$usersqli->real_escape_string($_POST['email'])."' AND password='".$usersqli->real_escape_string($_POST['password'])."'"); 
      header('Location: index.php') ; 
     }else{ 
      header('Location: index.php?show=login&err=Invalid login credentials') ; 
     } 
    } 

} 

注销:

setcookie('email','', time() - 60000); 
    setcookie('password', '', time() - 60000); 
    session_destroy(); 
    header("Location: index.php"); 

页眉每一页:

if(!$_SESSION[uid] && $_REQUEST[show]!='logout'){ 
    if (isset($_COOKIE['email']) && isset($_COOKIE['password'])) { 
     if ($result = $usersqli->query("SELECT * FROM users WHERE email='".$usersqli->real_escape_string($_COOKIE['email'])."'")) { 
      if ($result->num_rows==1){ 
       $row = $result->fetch_object(); 
       if(md5($usersqli->real_escape_string($row->password))==$_COOKIE['password']){ 
        $_SESSION["uid"]=$row->id;   
       } 
      } 
     } 
    } 
} 
+0

当然,第一个问题是在用户没有启用cookie时使其工作。 – drdwilcox

+0

或至少警告用户,他们需要启用cookie才能使用网站 – Aerik

+0

呃...把密码放在你的cookie里听起来不是一个好主意,对于初学者 –

回答

0

不要在cookie中的密码存储 - 重大安全禁忌。 有关于如何做到这一点的lots of articles

+0

?我认为这是不可能的MD5回到原来的字符串 –

+2

我认为这些行在这里︰if(!$ _ SESSION [uid] && $ _REQUEST [show]!='logout'){isset($ _ COOKIE [ 'email'])&& isset($ _ COOKIE ['password']))基本上允许我通过复制cookie来登录。即使您退出后也是如此。除非有什么我没有看到... – Aerik

+0

现在我完全明白你的意思了,也该怎么办!谢谢! –

0

在这两种身份验证机制中,您都遇到了会话固定问题。

我看不到明确的session_start()。

为什么使用2个独立的Cookie?

虽然密码的md5哈希意味着某人无法嗅探到原始密码,但没有什么能够阻止他们嗅探密码的哈希值,以便让他们访问密码。通过SSL运行这不会有帮助 - 但在cookie上设置安全和仅http标志将解决后一个问题。

+0

会话在页头中开始。我使用了两个饼干,因为我发现的例子使用了两个饼干。我了解哈希仍然很容易让其他人访问,如果他们有散列。但实际上,如果散列是密码或不是密码,他们所需要的只是访问密码,我看不到它的存在。虐待只看到http标志。谢谢 –

+0

使用质询机制进行基于密码的验证(例如,使用javascript将密码与会话cookie一起散列)与蚂蚁固定措施结合使用(当会话id与未过期会话不匹配时,强制新会话ID)将防止重播攻击。强制认证时使用新的会话ID(无论采用哪种方式)都会阻止注册。使用“记住我”令牌的随机值并将其与用户记录存储在数据库中将防止重放攻击 – symcbean