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



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

既然我通过验证器运行了vars,那么我该如何应用经过验证的数据呢?或者它已经被验证了,而我想得太多了?但我仍然想使用htmlspecialchar()。。。

<?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>");
?>

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

$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>");
?>

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

我想你指的是W3Schools(不要与拥有w3.org域名的W3C混淆):它们的质量非常低。他们经常是错的,即使他们是对的,他们也经常把重要的事情排除在解释之外。


现在我通过验证器运行vars,我如何应用已验证的数据?

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

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


任何逃逸和消毒都必须根据您对数据的处理进行定制。

在这种情况下…

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

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


$data = trim($data);

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

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

$data = stripslashes($data);

用于删除转义。您获取的数据一开始就不应该被转义。

当PHP有一个被误导和不可靠的自动转义功能时,这曾经是必要的,但它在几年前就被从PHP中删除了,即使它存在,代码也应该测试该功能是否打开。

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

不要那样做。

$data = htmlspecialchars($data);

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

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

不要那样做。

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

修剪输入是好的,因为输入可能有一些不必要的字符,如空格或数字。例如,如果输入是$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可以去除用于转义某些字符的飞溅。例如,如果使用stripslashes($name)$name = "O'reilly";$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.

最新更新