我的数据来自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>");
?>
答案 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。