【问题标题】:How to validate PHP form data with htmlspecialchars()如何使用 htmlspecialchars() 验证 PHP 表单数据
【发布时间】:2017-10-21 20:18:59
【问题描述】:

我有来自 html <form> 的数据。为了方便用户,这做了基本的 HTML5 验证,现在我需要做服务器端检查。到目前为止,我有这个来自 W3。

现在我通过验证器运行了 vars,如何应用经过验证的数据?还是它已经被验证了,我想多了?但我还是想用 htmlspecialchars()...

<?php

$fname = $lname = $email = $message = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $fname = test_input($_POST["fname"]);
  $lname = test_input($_POST["lname"]);
  $email = test_input($_POST["email"]);
  $message = test_input($_POST["message"]);
}

function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}

// email body stuff here

// send email 
mail($EmailTo, $Subject, $Body, "From: <$EmailFrom>");

?>

还是这样更好?但不确定如何包含 htmlspecialchars()

$EmailFrom = Trim(stripslashes($_POST['email']));
$EmailTo = "xxx@xxx.com";
$Subject = "Contact Form";
$fname = Trim(stripslashes($_POST['fname'])); 
$lname = Trim(stripslashes($_POST['lname'])); 
$email = Trim(stripslashes($_POST['email'])); 
$message = Trim(stripslashes($_POST['message'])); 

// email body stuff here

// send email 
mail($EmailTo, $Subject, $Body, "From: <$EmailFrom>");

?>

【问题讨论】:

    标签: php forms validation post


    【解决方案1】:

    到目前为止,我有这个来自 W3。

    我假设您的意思是 W3Schools(不要与拥有 w3.org 域的 W3C 混淆):它们的质量极低。他们经常是错的,即使他们是对的,他们也经常在解释中忽略重要的事情。


    现在我通过验证器运行了变量,我该如何应用这些经过验证的数据?

    test_input 返回数据。然后将其分配给变量。只需使用这些变量而不是存储在$_POST 中的原始数据。

    也就是说……test_input 函数完全不适合上下文,你不应该使用它


    任何转义和清理都必须根据您对数据的处理方式进行定制。

    在这种情况下……

    mail($EmailTo, $Subject, $Body, "From: <$EmailFrom>");
    

    …您正在发送纯文本电子邮件。


    $data = trim($data);
    

    您可能希望从用户意外键入的字符串的开头和结尾删除多余的空格。

    这不应该是需要的,并且对安全性没有帮助,但它没有害处并且可以使结果更整洁。

    $data = stripslashes($data);
    

    这用于删除转义。首先,您获取的数据不应该被转义。

    当 PHP 有一个 misguided and unreliable auto-escaping feature 时曾经需要此功能,但几年前已从 PHP 中删除,即使它在那里,代码也应该测试该功能是否已打开。

    由于没有要删除的转义,因此可以删除真实数据。

    不要那样做。

    $data = htmlspecialchars($data);
    

    您正在发送纯文本电子邮件。不是 HTML 电子邮件。输入不会接近 HTML。

    为 HTML 转义它只会让电子邮件的读者看到 HTML 实体而不是您希望他们看到的字符。

    不要那样做。

    【讨论】:

      【解决方案2】:

      这里有四个相关问题:修剪数据、转义字符、数据验证和数据清理。

      修剪输入是好的,因为输入可能有一些不必要的字符,例如空格或数字。例如,如果输入是$str = " 1.8 Some input",而您只想存储"Some input",那么您可以使用$str = ltrim($str, ' .0123456789');(第二个参数开头有一个空格)。

      通过mysqli_real_escape_string() 传递发布的数据很常见,这有助于创建合法的 sql 语句。除其他外,这将转义引号并允许将它们顺利输入到数据集中。详情见:http://php.net/manual/en/mysqli.real-escape-string.php

      使用stripslashes 可以删除用于转义某些字符的飞溅。例如,如果$name = "O\'reilly"; 使用stripslashes($name)$name 提供为O'reilly,这可能会因为未转义的引号而破坏您的sql 语句的逻辑。那么在使用mysqli_real_escape_string 之后你就不会再使用stripslashes了。

      在服务器端验证数据始终很重要。但是使用htmlspecialchars() 不会删除任何东西。在从存储数据的数据库中读取数据后,使用它编码的任何内容都将与使用 htmlspecialchars_decode() 解码数据时的状态相同。

      PHP 过滤器 应该用于验证和清理发送到服务器端的数据。例如,您可以按如下方式清理和检查已发布的电子邮件:

      // Sample email address, possibly got from $email = $_POST['email']
      $email = "someone@@example.com";
      
      // Remove all illegal characters from email
      $email = filter_var($email, FILTER_SANITIZE_EMAIL);
      
       // Validate e-mail address
      if(filter_var($email, FILTER_VALIDATE_EMAIL)){
          echo "The <b>$email</b> is a valid email address";
      } else{
          echo "The <b>$email</b> is not a valid email address";
      }
      // gives: The **someone@@example.com** is not a valid email address
      

      有关 PHP 过滤器的简要介绍,请参阅 https://www.tutorialrepublic.com/php-tutorial/php-filters.php ,我从上面的示例中获得。更多详情请见http://php.net/manual/en/book.filter.php

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        相关资源
        最近更新 更多