时光不老我们不散,天不会不蓝,我不会不在。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了时光不老我们不散,天不会不蓝,我不会不在。相关的知识,希望对你有一定的参考价值。
意思:表白恋人,无论时光流转,不离不弃,海枯石烂心不变。我永远爱你! 参考技术A 你好 很高兴为你解答朋友 这是一段歌词吧
这说的比唱的还好听呢
但愿你们能够天长地久 参考技术B 真正有这个的朋友或亲人,是值得珍惜的,祝你们友谊地久天长,永远幸福 参考技术C 祝友谊天长地久
好朋友之间就是这样的
如何在不散列 SQL 中的密码的情况下登录? [复制]
【中文标题】如何在不散列 SQL 中的密码的情况下登录? [复制]【英文标题】:How to login without hash the password in SQL? [duplicate] 【发布时间】:2019-05-28 15:10:17 【问题描述】:下午好!我自己在一个安全项目中工作。我在检查 PHP 中的登录代码时遇到问题。我不知道为什么,但是当我尝试使用我创建“数据库中的密码是纯文本”的用户登录时,它说密码不正确。
我们的想法不是将密码转换为哈希值。我知道这是一个很大的安全风险,但显然我不会将它用于专业用途。我的目的是进行安全测试。
检查.php:
<?php
include 'conn.php';
$conn = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
// Check connection
if (!$conn)
die("Connection failed: " . mysqli_connect_error());
$name = $_POST['name'];
$password = $_POST['password'];
$result = mysqli_query($conn, "SELECT Name, Password FROM users WHERE Name = '$name'");
$row = mysqli_fetch_assoc($result);
if (password_verify($_POST['password'], $row['Password']))
$_SESSION['loggedin'] = true;
$_SESSION['name'] = $row['Name'];
$_SESSION['start'] = time();
$_SESSION['expire'] = $_SESSION['start'] + (1 * 60) ;
echo "<div class='alert alert-success' role='alert'><strong>Welcome!</strong> $row[Name]
<p><a href='edit-profile.php'>Edit Profile</a></p>
<p><a href='logout.php'>Logout</a></p></div>";
else
echo "<div class='alert alert-danger' role='alert'>Name or Password are incorrects!
<p><a href='login.html'><strong>Please try again!</strong></a></p></div>";
?>
编辑我已经纠正了错误,但我仍然无法登录,出现一条消息:“名称或密码不正确!”。在我的数据库中,我有 4 列没有散列信息。 ID、姓名、电子邮件、密码
【问题讨论】:
password_verify()
无法处理纯文本密码存储。它是为完全相反的任务而设计的。
如果要比较纯字符串,请使用===
或strcmp
,而不是pw_verify
。这样做的理由完全是虚假的,顺便说一句。缺少参数绑定也是如此。
我记得早些时候关闭了一个完全相同的问题,而您没有没有按照所有重复项中的步骤“完全正确”。
警告:编写自己的访问控制层并不容易,而且有很多机会会严重错误。当任何现代的development framework(如Laravel)带有强大的authentication system 内置时,请不要编写自己的身份验证系统。
注意:mysqli
的面向对象接口明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的mysql_query
接口混淆。在您对程序风格投入过多之前,值得转换一下。示例:$db = new mysqli(…)
和 $db->prepare("…")
程序接口是 PHP 4 时代引入的 mysqli
API 的产物,不应在新代码中使用。
【参考方案1】:
如果数据库中的密码以纯文本形式存储,那么问题在于password_verify()
- 如explained in the manual - 期望它的第二个参数是(我引用):
password_hash()
创建的哈希。
该函数将尝试以与假设 $row 变量已散列相同的方式散列 $_POST 变量,然后将散列后的 $_POST 变量与 $row 变量进行比较。显然,这永远不会导致有效匹配,因为 $row 变量不是有效的哈希。
这个函数不是对给定的字符串进行简单的直接比较。如果你想这样做,只需写if ($_POST['password'] === $row['Password'])
,不需要额外的功能!
【讨论】:
嗨@ADyson,感谢您的帮助,但它仍然无法工作的代码“出现一条消息说“名称或密码不正确!”,也许我必须更改其他内容......如果你是这样亲,如果一切正常,你能检查一下代码吗?我已经在这里上传了代码:sandbox.onlinephpfunctions.com/code/…。 @DaZ 代码看起来应该可以工作。可能很简单,比如不使用正确的数据值,或者不通过 POST 发送数据。我不知道您要提交什么数据或数据库中有什么。你做了什么调试?使用一些var_dump() 语句将变量的值输出到屏幕上,以便您检查它们是否包含您所期望的。 @DaZ 另外请不要用半固定的代码更改问题 - 现在这里的答案没有多大意义。将问题恢复原状,或者至少包括原始代码以及您编辑的版本。谢谢。 好的,让我换个问题【参考方案2】:您已向我们展示了读取密码(或无法读取)的代码。但是您向我们展示了填充密码的代码,也没有告知您检查的数据是否符合您的预期。
虽然我知道您还不想走密码散列路线,但您确实应该了解一些有关 Web 应用程序安全性的知识。您将能够通过提供用户名来登录
any' OR '1'='1
有一个用于 SQL 注入的谷歌。
您的代码中没有错误检查/处理。对 MySQLi 的每个调用都应该有一个与之关联的错误处理程序。
您可以通过将生成的 SQL 写回浏览器并通过 mysql 命令行客户端或 PHPMyAdmin 运行它来检查它是否返回任何数据来开始解决您的问题。您还应该在代码中检查查询是否返回了零或一条记录(并相应地处理每种情况)。
如果您没有学习调试,那么您就没有学习编程。
$_SESSION['loggedin'] = true;
$_SESSION['name'] = $row['Name'];
$_SESSION['start'] = time();
$_SESSION['expire'] = $_SESSION['start'] + (1 * 60) ;
只有“name”变量应该设置为会话变量。
【讨论】:
【参考方案3】:在您的情况下,您不能使用 password_verify() 因为它仅用于散列密码(通过 password_hash ())
你必须检查密码像
if ($password == $row['password'])
【讨论】:
嗨@balzacLeGeek,感谢您的帮助,但它仍然无法工作的代码“出现一条消息说“名称或密码不正确!”,也许我必须更改其他内容......如果你是这样亲,如果一切正常,你能检查一下代码吗?我已经在这里上传了代码:sandbox.onlinephpfunctions.com/code/…以上是关于时光不老我们不散,天不会不蓝,我不会不在。的主要内容,如果未能解决你的问题,请参考以下文章