【问题标题】:Best approach to validate a form with PHP使用 PHP 验证表单的最佳方法
【发布时间】:2016-04-17 23:50:57
【问题描述】:

使用 PHP 验证表单最方便、“最佳”的方式是什么?我不希望像 Javascript 这样的语言来验证我的表单,我想知道仅使用 PHP 进行表单验证的最佳方法,更简洁的方法。

我是 PHP 新手,我正在处理一个注册页面,我完成了它,我想知道我所做的方法是否可以接受,以及是否有最好、方便、干净的方法来验证表单.

这是我使用的方法:

if (post form submitted (action same page)) {
  $errors = array(); // Initialize the variable error as an array

  if (various controls for the username which must not occur) {
    $errors[] = 'Inputnot valid.';
  }

  // for example:
  if (empty($_POST['username']) || !ctype_alnum($_POST['username'])) {
    $errors[] = 'Username not valid.';
  }

  if (empty($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
    $errors[] = 'Email not valid.';
  }

  if (empty($errors)) { // Check if the array is empty so that there are no errors
    echo 'everything is ok';
  } else { // There is errors
    foreach ($errors as $error) {
      echo $error;
    }
  }
}
// Begin HTML
<!DOCTYPE html>

【问题讨论】:

  • 出于安全原因,服务器端验证非常重要。您可以使用 PHP 框架。框架将通过非常简单的方式进行表单验证。

标签: php forms validation


【解决方案1】:

验证取决于您的程序逻辑。对用户输入的每个字段应用适当的逻辑。无效数据可能会破坏功能。

两种清理方式:参数化或转义数据库查询中使用的变量;还可以在使用htmlspecialchars()htmlentities() 打印到html 之前进行消毒。有时有更简单的方法:

消毒数字: $var = (int)$var; 现在对于 db 和 html 输出是安全的。

对所有安全字符(如字母数字用户名)验证的字符串数据执行preg_replacestr_replace 并删除任何不希望出现的字符。使用preg_replace 搜索您需要和使用的正则表达式。

密码:输入密码后,立即使用单向哈希(md5() 或更好)。比较哈希值是否相等。您永远不必知道或存储实际的密码。通过将 PW 存储为散列,破解您的用户表的人会看到一堆在输入 PW 字段时不起作用的散列。加盐你的哈希将使加密更难逆转。即在散列之前将“9827345978457”添加到每个密码。 (总是相同的难以猜测的盐)。

电子邮件:验证将检查 @ 和点,但它只是为了帮助用户避免拼写错误。清理电子邮件:db 的参数化或转义,输出时使用htmlspecialchars()

注意,当用户可以输入任何文本并使其有效(即 PW 或消息)时,preg_replace 不适用。这些是最难处理的输入。

【讨论】:

  • 但是是否有必要使用 preg_replace,例如密码/电子邮件,如果我要将此值与 PDO 绑定,然后准备并执行查询?因为,注册时输入的密码编译时可以使用更多的特殊字符,这样他的账号就更安全了。
  • 我添加了 3 段。 HTH。 @Keaire
【解决方案2】:

我建议从packagist 中选择一个包。

PHP 有很多与表单相关的扩展,但这里有一些流行的:

这些链接转到相应框架的文档页面。阅读他们并选择最适合您的。

您应该使用composer 进行安装。

【讨论】:

    【解决方案3】:

    试试这个示例代码:

    <?php
    // define variables and set to empty values
    $name = $email = $gender = $comment = $website = "";
    
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
      $name = test_input($_POST["name"]);
      $email = test_input($_POST["email"]);
      $website = test_input($_POST["website"]);
      $comment = test_input($_POST["comment"]);
      $gender = test_input($_POST["gender"]);
      if(empty($name) || empty($email) || empty($website) || empty($comment)){
        $errors = 'Input not valid.';
      }
      else {
        //Do success stuff here...
      }
    }
    
    
    function test_input($data) {
      $data = trim($data);
      $data = stripslashes($data);
      $data = htmlspecialchars($data);
      return $data;
    }
    ?>
    

    使用用户定义的函数来验证请求的值。

    【讨论】:

      【解决方案4】:

      如果您在服务器端验证数据,并且您的验证不需要应用程序业务逻辑(即您没有检查用户帐户中是否有足够的信用),您应该在控制器中进行验证。

      如果验证需要业务逻辑,在模型内部实现,通过控制器调用。

      你应该看看这个stackoverflow链接Best Place for Validation in Model/View/Controller Model?

      【讨论】:

        猜你喜欢
        • 2023-04-06
        • 1970-01-01
        • 2015-09-30
        • 2011-02-23
        • 1970-01-01
        • 2015-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多