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


How to create a secure login system using cookies and sessions?

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

  • userid
  • 用户名
  • userpassword (md5) -我创建这个是因为当用户保存重要设置(不要求用户完成表单)时,我会重新检查cookie中的密码和用户名。

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

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

谢谢!

谢谢你的回答!我需要竞争我的问题:我的网站不需要比一个简单的论坛更高的安全性,所以有人能提供一个代码,只有基本的安全水平?

首先,当你说你在数据库中存储"密码"时,请确保你存储的是加密的密码。如果我的密码是"12345",而你将"12345"存储在你的数据库中,那么你就使得可以访问你的数据库的人看到每个人的密码成为可能,这是非常糟糕的。

因此,至少使用SHA1或其他哈希算法并将 存储在数据库中。

但是关于你的实际问题,PHP内置了对"会话"的支持,这样你就不需要担心底层的机制了。

调用session_start();在你的脚本的顶部(通常在你的配置文件或头文件的开始,或其他一些共享的脚本,包括无处不在),然后你可以存储和检索信息在$_SESSION超全局数组

所以你可以写:

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

然后在另一页:

echo 'Hello, ' . $_SESSION['username'];

该会话信息将在session_start();已运行的任何页面上可用,并且您在$_SESSION中放入的任何内容都存储在服务器上的,因此不可能有人通过窥探我的浏览器cookie看到该信息。

然而,这并不意味着会话本身就是完全安全的。会话通过在cookie中存储"会话密钥"来工作,因此我的密钥可能是"946433D47A824675DCB87AA372F31A7D9B255530F87A79264E416C253E9AB00E"。每次访问一个页面,PHP都会检索与该键相关的所有$_SESSION数据,并将其提供给您。

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

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

<?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更好,也更快!

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

为了使它更安全,你可以在客户端级别应用md5几次,比如2次。

相关文章: