注册php、mysql密码、数据库
Posted
技术标签:
【中文标题】注册php、mysql密码、数据库【英文标题】:Registration php, mysql password, database 【发布时间】:2018-10-28 18:39:51 【问题描述】:我正在尝试制作一个注册表单,将用户名和密码保存到 phpmyadmin 的数据库中。
问题是用户名已保存但密码未保存。我的意思是当我使用密码“12345”注册时,当我进入数据库时,我的密码没有保存为“12345”,而是保存为“96991368fec63c8a1bfc48a70010f84a”或其他一些随机数...... 在数据库中,我将 Char(40) 作为密码。
这是我的代码:
<?php
session_start();
$db=mysqli_connect("localhost","root","","register");
if(isset($_POST['register']))
session_start();
$username=mysqli_real_escape_string($db,$_POST['username']);
$email=mysqli_real_escape_string($db,$_POST['email']);
$password=mysqli_real_escape_string($db,$_POST['password']);
$password =md5($password);
$sql = "INSERT INTO users(username,email,password)
VALUES('$username', '$email', '$password')";
mysqli_query($db, $sql);
$_SESSION['message'] = " You are now logged in";
$_SESSION['username'] = $username;
header("location: Login.php");
?>
这是形式:
form method="post" action="Registration.php">
<table>
<tr>
<td>Username:</td>
<td><input type="text" name="username" class="textInput"></td>
</tr>
<tr>
<td>Email:</td>
<td><input type="email" name="email" class="textInput"></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="password" class="textInput"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="register"Value="Register"></td>
</tr>
</table>
</form>
【问题讨论】:
正如Delete
所说,在与数据库交互时使用准备好的语句。他们防御 SQL 注入。正如zaph
所说,您存储密码的哈希并验证哈希。 PHP 具有处理此问题的本机函数。研究不同的算法。正如Jim Kyle
所说,您正在存储一个散列密码——尽管如此,不要使用 MD5。众所周知,它很脆弱,很容易破解。
【参考方案1】:
不保存密码,保存密码的密码哈希。使用 PHP 时,最简单的方法是使用 password_hash
和 password_verify
,这对安全且易于使用。
这使密码免受攻击者的攻击,并允许在用户登录时轻松验证密码。
更多:
当保存密码验证器时,仅使用散列函数是不够的,并且仅添加盐对提高安全性无济于事。而是使用诸如PBKDF2
、Rfc2898DeriveBytes
、Argon2
、password_hash
、Bcrypt
之类的函数或具有迭代计数的类似函数,从而消耗约 100 毫秒或 CPU 时间。关键是让攻击者花费大量时间通过蛮力查找密码。
【讨论】:
【参考方案2】:您在发布代码的第 12 行对 md5 函数的调用正在将用户的密码明文条目转换为您所抱怨的哈希字符串。 Zaph 的回答是完全正确的;如果您存储明文密码,任何入侵者都可以轻松访问它——这几乎是不安全的。
换句话说,你的代码看起来就像你告诉它做的那样——即使那不是你想要或期望的。
【讨论】:
【参考方案3】:使用准备好的语句
<?php
$host = 'localhost';
$user = 'root';
$pass = '';
$db = 'register';
try
$db_conn = new mysqli("$host", "$user", "$pass", "$db");
$db_conn->set_charset("utf8");
catch (Exception $e)
echo "Connection failed: " . $e->getMessage();
if(isset($_POST['register']))
session_start();
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_STRING);
$password = filter_input(INPUT_POST, 'password', FILTER_SANITIZE_STRING);
$password = password_hash($password, PASSWORD_BCRYPT);
$query = $db_conn->prepare("INSERT INTO users(username,email,password)VALUES(?,?,?)");
$query->bind_param('sss', $username, $email, $password);
$query->execute();
$counts = $query->num_rows;
$query->close();
if ($counts > 0)
$_SESSION['message'] = " You are now logged in";
$_SESSION['username'] = $username;
header("location: Login.php");
else
echo 'registration failed... Something went wrong';
?>
当用户尝试登录时结束执行此操作
$query = $db_conn->prepare("select password from users where username = ? limit 1");
$query->bind_param('s', $username);
$query->bind_result($dbpassword);
$query->execute();
$query->store_result();
$query->fetch();
$query->close();
if (password_verify($password, $dbpassword))
echo "login success";
else
echo "wrong password";
【讨论】:
cont:password_hash
使用了唯一的(随机)盐,因此两个密码不会散列到相同的结果。允许相同的密码散列到相同的结果会暴露所有使用相同密码的帐户,当知道一个人被暴力破解时。请参阅 password_hash
和 password_verify
,这对安全且易于使用。以上是关于注册php、mysql密码、数据库的主要内容,如果未能解决你的问题,请参考以下文章
php+jQuery+Mysql找回密码----ThinkPHP