如何使用htmlspecialchars()验证PHP表单数据

时间:2017-10-21 20:18:59

标签: php forms validation post

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

现在我通过验证器运行变量,如何应用验证数据?或者它已经过验证,我在想它?但我仍然想使用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>");

?>

2 个答案:

答案 0 :(得分:2)

  

到目前为止,我有这个来自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实体而不是您希望他们看到的字符。

不要那样做。

答案 1 :(得分:1)

此处有四个相关问题:修剪数据,转义字符,数据验证和数据清理。

修剪输入很好,因为输入可能有一些不必要的字符,如空格或数字。例如,如果输入为$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可以删除用于转义某些字符的splashes。例如,如果使用$name = "O\'reilly";的{​​{1}}将stripslashes($name)赋予$name,由于未转义的引号,可能会破坏sql语句的逻辑。因此,在使用O'reilly后,您将不会使用stripslashes

验证服务器端的数据始终很重要。但使用mysqli_real_escape_string不会删除任何内容。用它编码的任何内容都是在用htmlspecialchars()解码数据之后,从存储它的数据库中读取数据之后。

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

htmlspecialchars_decode()

有关PHP过滤器的温和介绍,请参阅上面示例中的https://www.tutorialrepublic.com/php-tutorial/php-filters.php。有关详细信息,请参阅http://php.net/manual/en/book.filter.php