【问题标题】:PHP, Bootstrap - user/password validationPHP, Bootstrap - 用户/密码验证
【发布时间】:2023-04-09 08:07:01
【问题描述】:

我正在学习 PHP 和 Bootstrap,但在尝试验证我的输入字段时遇到了问题。

在我添加 Bootstrap 之前,我能够验证表单,但现在它不起作用.. PHP 和 Bootstrap 是否由于某种原因不能以这种方式一起工作?

特别是我的页面似乎没有在 POST 上进行验证。

Bootstrap 是否有能力直接验证用户输入???

我有点困惑,如果我混合了不应该的技术......任何帮助将不胜感激。

谢谢,

<?php require_once('../Connections/login.php'); ?>
<?php
session_start();
//initialize the session and verify user is logged in and allowed to view site
if (!isset($_SESSION['USER_ID'])) {
    header("Location: login.php");
    exit();
}else{
    $qryUSER_ID=$_SESSION['USER_ID'];
}

//print_r($_POST);
//print_r($_SESSION);
//print_r($_GET);

?>
<?php
// define variables and set to empty values
$usernameErr = $passwordErr = $password_confirmErr = $password_matchErr = "";
$username = $password = $password_confirm = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  if (empty($_POST["username"])) {
    $usernameErr = "User name is required";
  } else {
    $username = test_input($_POST["username"]);
    // check if username only contains letters and whitespace
    if (!preg_match("/^[a-z0-9_.A-Z-' ]*$/",$username)) {
      $usernameErr = "Only letters, numbers and white space allowed";
    }
  }
  
  if (empty($_POST["password"])) {
    $passwordErr = "Password is required";
  } else {
    $password = test_input($_POST["password"]);
  }

  if (empty($_POST["password_confirm"])) {
    $password_confirmErr = "Password confirm is required";
  } else {
    $password_confirm = test_input($_POST["password_confirm"]);
  }
  
  if ($_POST['password'] !== $_POST['password_confirm']) {
    $password_matchErr = "Passwords must match";   
  }
}

function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>
<!doctype html>
<html lang="en">
<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <!-- Bootstrap CSS -->
    <link rel="stylesheet" src="/css/bootstrap.min.css" >
    <link href="/css/bootstrap.css" rel="stylesheet" type="text/css">
    <link rel="shortcut icon" href="/images/favicon.ico" type="image/x-icon" />
  <title>Skins Game-Add User</title>
</head>
<body>  

<form method="post" action="dtlprocess.php"> 

    <div class="form-group">
        <label class="control-label colspan="3" class="font-weight-bold"><h2>Add New User</h2></label>  
    </div>
    
      <div class="form-group">
        <label class="control-label col-sm-2">User Name:</label><span class="error"><?php echo $usernameErr;?></span>
        <div class="col-sm-10">
          <input type="text" class="form-control" name="username" value="<?php echo htmlspecialchars($username);?>">
        </div>
      </div>

      <div class="form-group">
        <label class="control-label col-sm-2">Password:</label><span class="error"><?php echo $passwordErr;?></span>
        <div class="col-sm-10">
          <input type="password" class="form-control" name="password" value="<?php echo htmlspecialchars($password);?>">
        </div>
      </div>

      <div class="form-group">
        <label class="control-label col-sm-2">Password Confirm:</label><span class="error"><?php echo $password_matchErr;?></span>
        <div class="col-sm-10">
          <input type="password" class="form-control" name="password_confirm" value="<?php echo htmlspecialchars($password_confirm);?>">
        </div>
      </div>
      
    <div class="form-group">
        <input type="submit" name="addUser" value="Submit" class="btn btn-secondary">&nbsp;&nbsp;&nbsp;<button type="submit" name="frmback" class="btn btn-secondary">Cancel</button></td>
    </div>      
</form>
</body>
</html>

【问题讨论】:

  • 又是可怕的test_input()。不要那样做,而是避免SQL Injection Attack 并在MYSQLI_PDO API 中使用prepared parameterized statements,而不是将用户提供的值连接到查询中。
  • 他们不会互相打扰,但“不起作用”究竟是什么意思
  • 不工作意味着用户输入没有被验证......我想我已经把它追踪到了 FORM ACTION 因为它没有提交给自己进行验证.. action=" php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>'
  • 另外,test_input()...这不是将用户输入添加到数据库的“安全”方法吗? .... $mysqli -> query("INSERT INTO users (user_name, password, active) VALUES ('$dd_username', '$dd_password', 'A') ") or die($mysqli->error);
  • 您应该考虑在MYSQLI_PDO API 中使用prepared parameterized statements,而不是将用户提供的值连接到查询中。

标签: php bootstrap-4


【解决方案1】:

如果以后有人遇到类似的问题...这里是使用参数 mysqli 修改的代码。

Bootstrap 似乎应该有一些用于验证用户名和验证密码的内置功能,因此消除了一些 php 代码。

谢谢,

<?php require_once('../Connections/login.php'); ?>
<?php
session_start();
//initialize the session and verify user is logged in and allowed to view site
if (!isset($_SESSION['USER_ID'])) {
    header("Location: login.php");
    exit();
}else{
    $qryUSER_ID=$_SESSION['USER_ID'];
}

//print_r($_POST);
//print_r($_SESSION);
//print_r($_GET);

?>
<?php
// define variables and set to empty values
$usernameErr = $passwordErr = $password_confirmErr = $password_matchErr = "";
$username = $password = $password_confirm = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  if (empty($_POST["username"])) {
    $usernameErr = "User name is required";
  } else {
    $username = test_input($_POST["username"]);
    // check if username only contains letters and whitespace
    if (!preg_match("/^[a-z0-9_.A-Z-' ]*$/",$username)) {
      $usernameErr = "Only letters, numbers and white space allowed";
    }
  }
  
  if (empty($_POST["password"])) {
    $passwordErr = "Password is required";
  } else {
    $password = test_input($_POST["password"]);
  }

  if (empty($_POST["password_confirm"])) {
    $password_confirmErr = "Password confirm is required";
  } else {
    $password_confirm = test_input($_POST["password_confirm"]);
  }
  
  if ($_POST['password'] !== $_POST['password_confirm']) {
    $password_matchErr = "Passwords must match"; 
  } else {
        //Past the validation checks, add new user
        //this also tests if the user exists before trying to add user since it will throw an error
        if (isset($_POST['addUser'])){
            
            //query if user exists already
            $checkuser = $mysqli->prepare("SELECT * FROM users WHERE user_name = ?");
            $checkuser->bind_param("s", $_POST['username']);
            $checkuser->execute();
            //row count will be > 0 if user exists
            $checkrows= $checkuser->get_result();   
            $checkuser->close();

            if($checkrows->num_rows > 0) {
                echo "User already exists";
                exit();
            }else{
                //Add new user since they do not exist
                $activeuser = 'A';
                $addnewuser = $mysqli->prepare("INSERT INTO users (user_name, password, active) VALUES (?,?,?)");
                $addnewuser->bind_param("sss", $_POST['username'], $_POST['password'], $activeuser);
                $addnewuser->execute();
                $addnewuser->close();
                
                header("Location: summary.php");
                exit();
            }
        }
  }

}
function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>
<!doctype html>
<html lang="en">
<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <!-- Bootstrap CSS -->
    <link rel="stylesheet" src="/css/bootstrap.min.css" >
    <link href="/css/bootstrap.css" rel="stylesheet" type="text/css">
    <link rel="shortcut icon" href="/images/favicon.ico" type="image/x-icon" />
<style>
    .error {color: #FF0000;}
    .font10{font-size: 10px;}
</style>

  <title>Skins Game-Add User</title>
</head>
<body>  

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>"> 

    <div class="form-group">
        <label class="control-label colspan="3" class="font-weight-bold"><h2>Add New User</h2></label>  
    </div>
    
      <div class="form-group">
        <label class="control-label col-sm-2">User Name:</label><label class="error font10"><?php echo $usernameErr;?></label>
        <div class="col-sm-10">
          <input type="text" class="form-control" name="username" value="<?php echo $username;?>">
        </div>
      </div>

      <div class="form-group">
        <label class="control-label col-sm-2">Password:</label><span class="error font10"><?php echo $passwordErr;?></span>
        <div class="col-sm-10">
          <input type="password" class="form-control" name="password" value="<?php echo $password;?>">
        </div>
      </div>

      <div class="form-group">
        <label class="control-label col-sm-2">Password Confirm:</label><span class="error font10"><?php echo $password_matchErr;?></span>
        <div class="col-sm-10">
          <input type="password" class="form-control" name="password_confirm" value="<?php echo $password_confirm;?>">
        </div>
      </div>
      
    <div class="form-group">
        <input type="submit" name="addUser" value="Submit" class="btn btn-secondary">&nbsp;&nbsp;&nbsp;<button type="submit" name="frmback" class="btn btn-secondary">Cancel</button></td>
    </div>      
</form>
</body>
</html>```

【讨论】:

  • 因此消除了一些 php 代码 您永远不能依赖在客户端浏览器中完成的验证。它可以被关闭或环绕,或者我可以在从未靠近您的页面时伪造一个 POST 到脚本。您应该始终在服务器代码中重复任何用户输入验证。
  • 虽然我不确定你在这里删除了什么:)
  • 对表单操作进行了更改... action="dtlprocess.php"。在我将其更改为 action="" 之前,这不会触发验证用户输入的序列
  • 我在验证 POST 时仍然遇到问题,提交表单时,EMPTY() 函数似乎无法正确识别用户名的空白或空白。 POST 看起来像这样,没有输入任何用户名或密码...数组( [username] => [password] => [password_confirm] => [addUser] => SUBMIT )并且没有因为空的用户名和密码而被捕获.. $_SERVER["PHP_SELF"] 在提交到 POST 时是否以某种方式修改表单字段导致此误报???
  • 您的脚本对SQL Injection Attack 开放。即使是if you are escaping inputs, its not safe!,您也应该始终在MYSQLI_PDO API 中使用prepared parameterized statements,而不是将用户提供的值连接到查询中。
【解决方案2】:

使用错误数组而不是空白变量。

您可以像这样使用验证,只需为此创建一个文件:

validation.php

        $name = test_input($_POST['name']);
        $login = test_input($_POST['login']);
        $email = test_input($_POST['email']);
        $password = test_input($_POST['password']);
        $password_confirm = test_input($_POST['password_confirm']);
        $succ = [];//old value of inputes will be stored here

        if(empty($name)){
            $errors['name'] = 'Name required';
        }else{
            $succ['name'] = $name;
        }

        if(empty($login)){
            $errors['login'] = 'Login required';
        }else{
            $succ['login'] = $login;
        }

        if(empty($email)){
            $errors['email'] = 'Email required';
        }else{
            $succ['email'] = $email;
        }

        if(empty($password)){
            $errors['password'] = 'password required';
        }

        if($password_confirm != $password){
            $errors['password_confirm'] = 'Passwords are not equal';
        }
    if(isset($errors)){
            $_SESSION['errors'] = $errors;
            $_SESSION['succ'] = $succ;
            header("Location: index.php");
            die;
        }else{
            header("Location: index.php")
        }

并添加到表单属性action="validation.php" 并添加到文件顶部:

index.php

if(isset($_SESSION['errors'])){
    $errors = $_SESSION['errors'];//execute errors from the session
    $succ = $_SESSION['succ'];
    unset($_SESSION['succ']);
    unset($_SESSION['errors']);//delete all errrors from the session
}

然后您可以在页面上使用 $errors 作为错误数组。

之后,您可以像这样为每个输入添加一个错误容器:

.
.
...<input type="text" name="name" ....
<span class="error">
    <?php 
        if(isset($errors['name'])){
            echo $errors['name'];
        }
    ?>
</span>

【讨论】:

    猜你喜欢
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多