Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用cookie和会话创建安全的登录系统?_Php_Security_Session_Cookies - Fatal编程技术网

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

Php 如何使用cookie和会话创建安全的登录系统?,php,security,session,cookies,Php,Security,Session,Cookies,我有一个包含用户名、用户名和密码的mysql表,如果给定的密码与给定的用户名匹配,我将创建3个cookie: 用户ID 用户名 userpassword(md5)-我之所以创建它,是因为当用户保存重要设置时(不要求用户填写表单),我会重新检查Cookie中的密码和用户名 我听说这是不安全的,我应该只使用cookie来存储会话id,并将这些数据存储在会话中,但是代码看起来如何呢 请解释一下代码,因为我是PHP的初学者。 哦,我想长期记住用户,我不喜欢每次都需要登录的网站。请帮我解释一下为什么一

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

  • 用户ID
  • 用户名
  • userpassword(md5)-我之所以创建它,是因为当用户保存重要设置时(不要求用户填写表单),我会重新检查Cookie中的密码和用户名
我听说这是不安全的,我应该只使用cookie来存储会话id,并将这些数据存储在会话中,但是代码看起来如何呢

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

谢谢


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

首先,当你说你在数据库中存储“密码”时,请确保你存储的是加密的密码。如果我的密码是“12345”,而你将“12345”存储在你的数据库中,那么你就可以让访问你数据库的人看到每个人的密码,这太糟糕了

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

但是关于您的实际问题,PHP内置了对“会话”的支持,因此您不必担心底层机制

调用
session_start()
位于脚本的顶部(通常位于配置文件或头文件的开头,或其他任何地方都包含的共享脚本),然后您可以在
$\u会话
超全局数组中存储和检索信息

所以你可以写:

$_SESSION['username'] = 'bob';
然后在另一页上:

echo 'Hello, ' . $_SESSION['username'];
该会话信息将出现在
session_start()的任何页面上
已经运行,您在
$\u SESSION
中输入的任何内容都只存储在服务器上,因此,仅通过窥探我的浏览器cookie是不可能看到这些信息的

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

但是如果有人发现了这个密钥(比如,通过窥探我的浏览器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更好,也更快

除非您使用ssl连接,否则在php中使用
md5()
函数是不安全的,因为只有在表单值到达服务器后,此php函数才会被加密。因此,您认为加密的密码通过网络以纯文本格式传输。在传输过程中可能会被截获,因为表单元素以纯文本格式提交。为了消除这个安全漏洞,您可以在客户端级别加密密码。例如使用JavaScript。这样的JavaScript代码在类似internet的应用程序中很容易获得


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

是的,使用会话而不是将密码存储为cookie,即使它是md5。查看更多信息。不要使用MD5,它不像人们想象的那样安全。我不认为PHP会话密钥真的像“946433D47A824675DCB87AA372F31A7D9B255530F87A79264E416C253E9AB00E”那么长,但绝对足够强大,可以猜测!Votey,你能让会话比当前浏览器会话持续更长时间吗?会话键可以是你想要的长或短,但我相信默认情况下你是对的,它更短@Francisc请参阅session_set_cookie_params()函数以控制会话cookie的保存方式。如果我没有弄错的话,会话密钥默认为16个字符。谢谢你的提示,沃蒂。很好。在运行SQL之前,您需要连接数据库!更快对密码散列不利–请记住,如果攻击者需要对其进行暴力攻击,则每个散列计算所需的时间越长,模式的强度就越强。尽管如此,SHA1在哈希方面还是比MD5好。事实并非如此,在连接之前,您也可以运行SQL命令。。。您将得到错误,但仍然可以调用函数。:)@Francisc我可以编写PHP程序并将其托管在.NET服务器中,尽管它不会执行,但仍然不会给出任何错误:PDon实际上不会应用MD5两次,因为这对事情没有帮助。如果它通过应用两次而变得更好,那么该算法已经做到了!(问题是,第二个散列是非常可逆的,因为有少量可能的输入)在客户机中应用md5也不会使任何事情更加安全。如果您以散列形式向服务器发送密码,散列实质上就是您的密码。