【发布时间】:2017-09-02 14:30:29
【问题描述】:
所以我正在尝试创建一个登录表单,现在我正处于我想要验证密码和确认密码的部分。我使用的代码(您可以在下面找到)每次提交注册按钮时都会向我显示“密码和确认密码不匹配”,即使我输入了相同的密码。知道应该在我的代码中更改什么以消除错误吗?
<?php
session_start();
include('includes/config.php');
include('includes/db.php');
function isUnique($email){
$query="select * from users where email ='$email'";
global $db;
$result = $db->query($query);
if($result->num_rows>0){
return false;
}
else return true;
}
if(isset($_POST['register'])) {
$_SESSION['name']=$_POST ['name'];
$_SESSION['email']=$_POST ['email'];
$_SESSION['password']=$_POST ['password'];
$_SESSION['confirm_password']=$_POST ['confirm_password'];
if(strlen($_POST['name'])<3){
header("Location:register.php?err=".urlencode ("The name must be at least 3 characters long"));
exit();
}
else if(strlen($_POST['password']) < 5 ){
header("Location:register.php?err=".urlencode ("The password should be at least 5 characters"));
exit();
}
else if(strlen($_POST['confirm_password']) < 5 ){
header("Location:register.php?err=".urlencode ("The Confirm password should be at least 5 characters"));
exit();
}
else if(!isUnique($_POST['email'])){
header("location:register.php?err=".urlencode ("Email is already in use. Please use another one"));
exit();
}
else if($_POST['[password'] != $_POST['confirm_password']) {
header("Location:register.php?err=".urlencode ("The password and confirm password do not match"));
exit();
}
}
?>
这是我在应该显示错误消息时放置条件的另一部分。
`<form action="register.php" method="post" style="margin-top:35px;">
<h2> Register Here </h2>
<?php
if(isset ($_GET['err'])) { ?>
<div class="alert alert-danger"><?php echo $_GET['err']; ?></div>
<?php }
?>`
【问题讨论】:
-
这里的第一个问题是你为什么要写所有这些开始?这是一个学术项目吗?这种代码很难做到绝对完美,否则就会让您面临严重的安全风险。
-
如果你想检查所有字段以验证所以不要使用 else if 单独为每个字段使用 if 因为在你的 else if 情况下如果第一个情况满足 true 那么所有下面的 else if case 不会满足执行
-
这里有问题。仔细看。 $_POST['[password'] != $_POST['confirm_password']
-
警告:这有一些严重的SQL injection bugs,因为在查询中使用了
$_GET数据。尽可能使用准备好的语句。在mysqli和PDO 中执行这些操作非常简单,其中任何用户提供的数据都使用?或:name指示符指定,稍后使用bind_param或execute填充,具体取决于您是哪个使用。 切勿将$_POST或$_GET数据直接放入您的查询中。 -
警告:编写自己的访问控制层并不容易,而且有很多机会会严重错误。当任何现代development framework(如Laravel)带有强大的authentication system 内置时,请不要编写自己的身份验证系统。至少遵循recommended security best practices 并且永远不要将密码存储为纯文本。
标签: php mysql forms session post