【问题标题】:PHP Validation from database来自数据库的 PHP 验证
【发布时间】:2015-06-13 14:05:06
【问题描述】:

我正在做一个项目,但我卡在了注册页面上。我想验证是否:

  1. 手机号码已存在。
  2. 用户名已存在。
  3. 电子邮件 ID 已存在。

目前在我的代码中,我添加了对手机号码的验证,并且工作正常。但是用户名和电子邮件部分我不明白如何实现它。请帮我解决我的问题。

这是我的代码。

<?php
$msg = '';
if(isset($_POST['register']))
{
    $uname = (!empty($_POST['username']))?$_POST['username']:null;
    $pass = (!empty($_POST['pass']))?$_POST['pass']:null;
    $cpass = (!empty($_POST['cpass']))?$_POST['cpass']:null;
    $fname = (!empty($_POST['fname']))?$_POST['fname']:null;
    $lname = (!empty($_POST['lname']))?$_POST['lname']:null;
    $email = (!empty($_POST['email']))?$_POST['email']:null;
    $mobile = (!empty($_POST['mobile']))?$_POST['mobile']:null;

if($uname == '' || $pass == '' || $cpass == '' || $fname == '' || $lname == '' || $email == '' || $mobile == ''){
    $msg = "<font color='red'>Fields cannot be empty</font>";
}else if(strlen($uname)<5){
    $msg = "<font color='red'>Username must be at least 5 characters long</font>";
}else if(strlen($pass)<6 && strlen($cpass)<6){
    $msg = "<font color='red'>Password must be at least 6 characters long</font>";
}else if($pass != $cpass){
    $msg = "<font color='red'>Passwords are not matching</font>";
}else if(!is_numeric($mobile)){
    $msg = "<font color='red'>Mobile number should contain only numbers</font>";
}else if(strlen($mobile)<10){
    $msg = "<font color='red'>Mobile number should be at least 10 characters long</font>";
}else{

        $query = "SELECT user_mobile FROM user_reg WHERE user_mobile = '".$mobile."'";
        $query1 = mysql_query($query) or die(mysql_error());
        $num_rows = mysql_num_rows($query1);
        $row = mysql_fetch_array($query1);

        if($num_rows > 0)
        {
          $msg = "<font color='red'>Mobile number already exists. Please try again...</font>";
        }
else{
    $str = "INSERT INTO user_reg(user_email, user_uname, user_pass, user_fname, user_lname, user_mobile)VALUES('$email','$uname','$pass','$fname','$lname','$mobile')";
    $sql = mysql_query($str) or die(mysql_error());

if($sql){
    $msg = "<font color='green'>Regstration successfull. Please Login to use your account.</font>";
    }else{
    $msg = "<font color='red'>Sorry.. There are some errors. Please fix them before you continue.</font>";
   }
  }
 }
}
?>

HTML 部分。

<div class="reg-box"><br />
  <center>
    <?php echo $msg; ?>
  </center>
  <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <div>
      <label>Username</label>
      <input type="text" name="username" value="" class="a-text" />
    </div>
    <div>
      <label>Password</label>
      <input type="password" name="pass" value="" class="a-text" />
    </div>
    <div>
      <label>Confirm Password</label>
      <input type="password" name="cpass" value="" class="a-text" />
    </div>
    <div>
      <label>First Name</label>
      <input type="text" name="fname" value="" class="a-text" />
    </div>
    <div>
      <label>Last Name</label>
      <input type="text" name="lname" value="" class="a-text" />
    </div>
    <div>
      <label>Email</label>
      <input type="email" name="email" value="" class="a-text" />
    </div>
    <div>
      <label>Mobile</label>
      <input type="text" name="mobile" value="" class="a-text" maxlength="10" />
    </div>
    <input type="submit" name="register" value="Register" class="button" id="button-left" />
  </form>
</div>

我应该怎么做添加用户名和电子邮件验证?请朋友们帮帮我。

【问题讨论】:

  • 您不能使用与移动设备相同的验证吗? "SELECT username FROM user_reg WHERE username = '".$uname."'"
  • 是的,我可以..这是唯一的方法,但我的问题是如何再次使用该代码,因为我不能使用任何 if...else 那里,因为它已经在 else 语句中...那里我不能再次应用它......这就是问题......我知道要实施什么,但我对如何实施它感到困惑......
  • 您可以使用此代码进行 SQL 注入。您应该分别检查每个字段并附加$msg。目前,如果用户在每个领域都有问题,他们需要提交 6 次表单才能解决。我对I cant use any if...else there 感到困惑,你为什么不能?
  • 你能告诉我如何在此处添加该代码以检查用户名和密码吗?以及如何打开 sql 注入?
  • 看到这个,php.net/manual/en/security.database.sql-injection.php。每当您将用户输入直接传递到您的 SQL 中时,您都会对 SQL 注入持开放态度。您可以使用php.net/manual/en/function.mysql-real-escape-string.php,但请阅读顶部的警告并考虑切换到 PDO 或 mysqli_ 函数。您正在尝试检查用户名是否唯一?你想用无效的密码检查什么?您也不应该以纯文本形式存储密码。 php.net/manual/en/faq.passwords.php

标签: javascript php jquery html mysql


【解决方案1】:

在 cmets 中已经声明您的代码使用不安全。

使用prepared statements 和现代password hashing 方法。

  • 请查阅我的脚注。

要回答问题,请使用以下命令:

$query = "SELECT * FROM user_reg 
WHERE user_mobile = '".$mobile."'

AND user_email = '$email' 
AND user_uname = '$uname' 

";
  • 这将匹配所有条件。

  • 您可以使用OR 或混合使用来分隔条件,以检查“任何”条件。我会让你决定应该满足哪些条件。


脚注

您当前的代码对SQL injection 开放。使用mysqli with prepared statementsPDO with prepared statements它们更安全

密码:

我注意到您可能以纯文本形式存储密码。如果是这种情况,则非常不鼓励。

但是我还没有使用 MD5 加密,稍后我将使用它。

另外,您在评论中提到想要使用 MD5。 不要使用它。它已经过时并且不再安全用作密码哈希/存储方法。

我建议您使用CRYPT_BLOWFISH 或PHP 5.5 的password_hash() 函数。对于 PHP password_hash() compatibility pack

【讨论】:

  • 我不能使用这个,因为我想分别显示用户名、电子邮件和移动设备的每个错误的消息。我想分别执行语句。
  • @ShubhamJha 然后尝试 Gideon 的答案,或者使用最适合此问题的 Ajax。
  • @ShubhamJha 你也应该在你的问题中指出这一点,而不是在 cmets 中。我并不总是检查下一个无穷无尽的 cmets。我看到一个问题并回答它,我这样做并指出了您代码中的弱点。在我看来,Ajax 将是一种更好的使用方法,并且会大大减少您的代码。
【解决方案2】:

@Jha,您似乎很困惑。嗯,我知道,有点奇怪。但如果我是你,我会过去的:

<?php
$msg = '';

if (isset($_POST['register'])) {

    $uname  = (!empty($_POST['username'])) ? $_POST['username'] : null;
    $pass   = (!empty($_POST['pass'])) ? $_POST['pass'] : null;
    $cpass  = (!empty($_POST['cpass'])) ? $_POST['cpass'] : null;
    $fname  = (!empty($_POST['fname'])) ? $_POST['fname'] : null;
    $lname  = (!empty($_POST['lname'])) ?$_POST['lname'] : null;
    $email  = (!empty($_POST['email'])) ?$_POST['email'] : null;
    $mobile = (!empty($_POST['mobile'])) ?$_POST['mobile'] : null;

    if ($uname == '' || $pass == '' || $cpass == '' || $fname == '' || $lname == '' || $email == '' || $mobile == '') {
        $msg = "<font color='red'>Fields cannot be empty</font>";

    } else if (strlen($uname) < 5) {
        $msg = "<font color='red'>Username must be at least 5 characters long</font>";

    } else if (strlen($pass) < 6 && strlen($cpass) < 6) {
        $msg = "<font color='red'>Password must be at least 6 characters long</font>";

    } else if ($pass != $cpass) {
        $msg = "<font color='red'>Passwords are not matching</font>";

    } else if (!is_numeric($mobile)) {
        $msg = "<font color='red'>Mobile number should contain only numbers</font>";

    } else if (strlen($mobile) < 10) {
        $msg = "<font color='red'>Mobile number should be at least 10 characters long</font>";

    } else {
        //query for mobile validation
        $m_sql      = "SELECT user_mobile FROM user_reg WHERE user_mobile = '".$mobile."'";
        $m_query    = mysql_query($m_sql) or die(mysql_error());
        $m_num_rows = mysql_num_rows($m_query);
        $m_row      = mysql_fetch_array($m_query);

        //query for username validation
        $u_sql      = "SELECT user_mobile FROM user_reg WHERE user_mobile = '".$uname."'";
        $u_query    = mysql_query($u_sql) or die(mysql_error());
        $u_num_rows = mysql_num_rows($u_query);
        $u_row      = mysql_fetch_array($u_query);

        //query for email validation
        $e_sql      = "SELECT user_email FROM user_reg WHERE user_mobile = '".$email."'";
        $e_query    = mysql_query($e_sql) or die(mysql_error());
        $e_num_rows = mysql_num_rows($e_query);
        $e_row      = mysql_fetch_array($e_query);

        if ($m_num_rows > 0) {
            $msg = "<font color='red'>Mobile number already exists. Please try again...</font>";

        } else if ($u_num_rows > 0) {
            $msg = "<font color='red'>Username already exists. Please choose a unique one...</font>";

        } else if ($e_num_rows > 0) {
            $msg = "<font color='red'>Email already exists. Please choose a unique one...</font>";

        } else {
            $str = "INSERT INTO user_reg(user_email, user_uname, user_pass, user_fname, user_lname, user_mobile)VALUES('$email','$uname','$pass','$fname','$lname','$mobile')";
            $sql = mysql_query($str) or die(mysql_error());

            if ($sql) {
                $msg = "<font color='green'>Regstration successfull. Please Login to use your account.</font>";
            } else {
                $msg = "<font color='red'>Sorry.. There are some errors. Please fix them before you continue.</font>";
            }
        }
    }
}

?>

【讨论】:

  • 它实际上通过了,您的代码对 SQL 注入非常开放,并且不推荐使用 mysql 数据库连接层,因此请尝试使用 mysqli 或 pdo。希望一切顺利。
  • 正是我的问题的解决方案...我得到了我想要的东西。非常感谢……但是我期待在我的代码中使用 mysqli_。谢谢。 :)
  • 稍后我会寻找准备好的语句。但目前这是解决方案。谢谢。 :)
  • 兄弟加 1 :)
【解决方案3】:

除了修复代码使其不易受到 SQL 注入攻击之外,您还应该更改查询以使用 OR 运算符同时检查所有三个输入。

$query = "SELECT * FROM user_reg WHERE user_mobile = '".$mobile."' OR user_uname = '".$uname."' OR user_email = '".$email."'";

然后,如果您确实获得了任何命中,您可以检查一下它是什么:

if($query1->num_rows > 0){
        while($field = $query1->fetch_assoc()){
            if($field['user_mobile'] === $mobile){
                 $msg = $msg . "<font color='red'> Mobile number already exists. Please try again...</font>";
            }
            if($field['user_email'] === $email){
                $msg = $msg . "<font color='red'> Email already exists. Please choose a unique one...</font>";
            }
            if($field['user_uname'] === $uname){
                 $msg = $msg . "<font color='red'> Username already exists. Please choose a unique one...</font>";
            }
        }
    }

但就像其他人说的那样,您需要切换到使用 MySQLi 或 PDO_MySQL

【讨论】:

  • 我可以使用它,但它只会让我显示一条消息.. 像用户数据已经存在...我想单独显示消息,如手机号码已经存在、用户名已经存在、电子邮件ID 已经存在.. 为此,我有必要分别使用每个语句...但是如何?
猜你喜欢
  • 2017-06-20
  • 2022-12-18
  • 2015-09-15
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
相关资源
最近更新 更多