如何使用cookie和会话创建安全的登录系统?

时间:2011-04-23 13:14:01

标签: php security session cookies

我有一个带有用户ID,用户名和密码的mysql表,如果给定的密码与给定的用户名匹配,我创建3个cookie:

  • 用户ID
  • 用户名
  • userpassword(md5) - 我创建此项是因为我在用户保存重要设置时重新检查密码和Cookie中的用户名(不要求用户填写表单)。

我听说这不安全,我应该只使用cookie来存储会话ID,并将这些数据存储在会话中,但是如何查看代码?

请解释一下代码,因为我是PHP的初学者。 哦,我想长时间记住用户,我不喜欢每次需要登录的网站。请帮助我并解释一下为什么一种方法比其他方法更安全?

谢谢!

感谢您的回答!我需要与我的问题竞争:我的网站不需要比简单论坛更高的安全性,那么有人可以提供一个只有基本安全级别的代码吗?

3 个答案:

答案 0 :(得分:3)

首先,当您说您在数据库中存储“密码”时,请确保存储 加密 密码。如果我的密码是“12345”并且您在数据库中存储了“12345”,那么您可以让访问您数据库的人查看每个人的密码,而这只是非常糟糕。

所以,至少,使用SHA1或其他一些哈希算法,并在数据库中存储

但是根据您的实际问题,PHP支持内置的“会话”,这样您就不必担心低级别的机制了。

在脚本顶部调用session_start();(通常在配置文件或头文件的开头附近,或者包含在其他地方的其他一些共享脚本),然后您可以在{{存储和检索信息1}}超全局数组。

所以你可以写:

$_SESSION

然后在其他页面上:

$_SESSION['username'] = 'bob';

该会话信息将在已运行echo 'Hello, ' . $_SESSION['username']; 的任何网页上提供,您放入session_start();的任何内容仅存储在 上服务器,所以有人只能通过浏览我的浏览器cookie来看到这些信息。

但是,这并不意味着会话本质上是完全安全的。会话通过在cookie中存储“会话密钥”来工作,因此我的密钥可能是“946433D47A824675DCB87AA372F31A7D9B255530F87A79264E416C253E9AB00E”。每次访问页面时,PHP都会检索与该密钥关联的所有$_SESSION数据,并使其可供您使用。

但是,如果有人发现该密钥(再次通过我的浏览器cookie窥探,或者只是“偷听”我通过开放的Wi-Fi网络向服务器发出的请求),他们可以发送相同的密钥和PHP会兴高采烈地让他们访问我的会话。

如果你只允许通过https进行流量,这个问题在很大程度上得到缓解,但仍然绝对值得了解正在发生的事情以及如何在安全问题的情况下利用它。

答案 1 :(得分:0)

<?php
session_start();

$pwd=sha1($_POST['pwd']);
$login=$_post['username'];

 $stmt = mysqli_prepare($con, "SELECT UID from LOGIN where userName=? and password=?");
 mysqli_stmt_bind_param($stmt, "ss", $login,$pwd);
 mysqli_stmt_execute($stmt);
 mysqli_stmt_bind_result($stmt, $uid);
 mysqli_stmt_fetch($stmt);
 mysqli_stmt_close($stmt);
 if (!is_null($uid))
 $_SESSION['uid']=$uid;
?>

使用SHA1,因为它比md5更好,也更快!

答案 2 :(得分:0)

除非你使用ssl连接,否则在php中使用md5()函数是不安全的,因为这个php函数只有在表单值到达服务器后才会被加密。因此,您认为加密的密码通过网络以纯文本格式传输。在传输过程中可以拦截,因为表单元素以纯文本格式提交。要摆脱这个安全漏洞,您可以在客户端级别加密密码。比如使用JavaScript。此类JavaScript代码可在互联网上轻松获得,如http://phpjs.org/functions/md5:469

为了使其更安全,您可以在客户端级别应用md5几次,例如2次。