【发布时间】:2016-08-30 12:34:42
【问题描述】:
我正在用 PHP 为我的网站创建一个用户注册表单,并将用户数据“发布”到我的 SQL 数据库。当我创建前两个用户时,它会将用户信息发布到我的数据库中,例如用户名和电子邮件,每个字段都有一行 NULL。我没有更改我的 PHP 代码中的任何内容,但是现在当我创建一个用户时,它会向数据库添加一个新行,但所有字段都是 NULL,并且是密码的哈希码。我不知道为什么它出现为 NULL。下面我将包括我的 register.php 代码。
<?php
#session_start();
#if(isset($_SESSION['User']))
#{
# header("Location: home.php");
#}
include_once 'dbconnect.php';
#if(isset($_POST['submit']))
#
$uname = $_POST['uname'];
$email = $_POST['email'];
$upass = $_POST['upass'];
$stmt = $dbh->prepare("SELECT COUNT(*) as `emailcount` FROM `User` WHERE email=:email");
$stmt->execute(array("email" => $_POST['email']));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if ($row['emailcount'] > 0) {
echo "<script>alert('Email $email already exists in our system. Please try another email')</script>";
} else {
$stmt = $dbh->prepare("INSERT INTO User(`uname`, `email`, `upass`) VALUES (:uname, :email, :upass)");
$stmt->execute(array("uname" => $_POST['uname'], "email" => $_POST['email'], "upass" => md5($_POST['upass'])));
}
?>
我还将在此处包含我正在使用的 HTML 表单
<form method='post' action='register.php'>
<pre>
<div>
<label>Name : (letters only)*</label>
<input type="text" name="uname" pattern="[A-Za-z]+" title="only letters" required />
</div>
<div>
<label>E-mail : (xyz@zyx.com)*</label>
<input type="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$" title="xyz@something.com" required />
</div>
<div>
<label>password : (at least 6 chars)</label>
<input type="password" name="upass" pattern=".{6,}" title="Six or more characters" required />
</div>
<input type='submit' name='submit' value='Sign Up'>
</pre>
</form>
【问题讨论】:
-
警告:编写自己的访问控制层并不容易,而且有很多机会会严重错误。当任何现代的development framework(如Laravel)带有强大的authentication system 内置时,请不要编写自己的身份验证系统。至少遵循recommended security best practices 并且永远不要将密码存储为纯文本或使用非常弱的MD5。
-
你真的不应该使用MD5 password hashes请使用PHP的built-in functions来处理密码安全。在散列之前,请确保您 don't escape passwords 或对它们使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。
-
值得注意的是,您要测试是否有重复,然后继续插入。
-
您没有适当的控制措施来检查空 POST 变量,甚至是语句准备失败。那里可能出现任何问题,您需要检查所有操作的结果。
-
您好,在您获得帮助后,请不要破坏您的帖子。这就像在树下避难后砍倒一棵树。请允许其他未来的用户从知识中获益。回答者会付出很多努力。不要浪费他们宝贵的时间。