繁体   English   中英

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

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

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

  • 用户身份
  • 用户名
  • 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次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM