本章和后续章节将介绍如何使用 PHP 验证表单数据。
处理 PHP 表单时要考虑安全!
这些页面将展示如何在考虑安全性的情况下处理 PHP 表单。正确验证表单数据对于保护您的表单免受黑客和垃圾邮件发送者的侵害非常重要!
我们将在这些章节中使用的 HTML 表单包含各种输入字段:必填和可选文本字段、单选按钮和提交按钮:
上述表单的验证规则如下:
Field | Validation Rules |
---|---|
Name | Required. + Must only contain letters and whitespace |
Required. + Must contain a valid email address (with @ and .) | |
Website | Optional. If present, it must contain a valid URL |
Comment | Optional. Multi-line input field (textarea) |
Gender | Required. Must select one |
首先我们看一下表单的纯 HTML 代码:
姓名、电子邮件和网站字段是文本输入元素,评论字段是文本区域。 HTML 代码如下所示:
Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>
性别字段是单选按钮,HTML 代码如下所示:
Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male
<input type="radio" name="gender" value="other">Other
表单的 HTML 代码如下所示:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
提交表单时,通过method="post"发送表单数据。
$_SERVER["PHP_SELF"] 变量是什么?
$_SERVER["PHP_SELF"] 是一个超级全局变量,它返回当前正在执行的脚本的文件名。
因此,$_SERVER["PHP_SELF"] 将提交的表单数据发送到页面本身,而不是跳转到其他页面。这样,用户将在与表单相同的页面上收到错误消息。
htmlspecialchars() 函数是什么?
htmlspecialchars() 函数将特殊字符转换为 HTML 实体。这意味着它将用 < 和 > 替换 HTML 字符 < 和 > 。和>。这可以防止攻击者通过在表单中注入 HTML 或 Javascript 代码(跨站点脚本攻击)来利用代码。
$_SERVER["PHP_SELF"] 变量可以被黑客利用!
如果页面中使用 PHP_SELF,则用户可以输入斜杠 (/),然后输入一些跨站脚本 (XSS) 命令来执行。
跨站脚本 (XSS) 是一种常见于 Web 应用程序中的计算机安全漏洞。 XSS 使攻击者能够将客户端脚本注入其他用户查看的网页中。
假设我们在名为"test_form.html"的页面中有以下表单:
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
现在,如果用户在地址栏中输入普通 URL,例如 "http://www.example.com/test_form.html",则上述代码将被翻译为:
<form method="post" action="test_form.html">
到目前为止,一切都很好。
但是,请考虑用户在地址栏中输入以下 URL:
http://www.example.com/test_form.html/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
在这种情况下,上面的代码将被翻译为:
<form method="post" action="test_form.html/"><script>alert('hacked')</script>
此代码添加了一个脚本标记和一个警报命令。当页面加载时,JavaScript 代码将被执行(用户将看到一个警告框)。这只是一个如何利用 PHP_SELF 变量的简单且无害的示例。
请注意这一点任何 JavaScript 代码都可以添加到 <script> 标签内!例如,黑客可以将用户重定向到另一台服务器上的文件,该文件可能包含恶意代码,这些代码可以更改全局变量或将表单提交到另一个地址以保存用户数据。
使用 htmlspecialchars() 函数可以避免 $_SERVER["PHP_SELF"] 漏洞。
表单代码应如下所示:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars() 函数将特殊字符转换为 HTML 实体。现在,如果用户尝试利用 PHP_SELF 变量,将会产生以下输出:
<form method="post" action="test_form.html/"><script>alert('hacked')</script>">
漏洞利用尝试失败,并且没有造成任何损害!
我们要做的第一件事是通过 PHP 的 htmlspecialchars() 函数传递所有变量。
当我们使用 htmlspecialchars() 函数时;那么如果用户尝试在文本字段中提交以下内容:
<script>location.href('http://www.hacked.com')</script>
- 这不会被执行,因为它将被保存为 HTML 转义代码,如下所示:
<script>location.href('http://www.hacked.com')</script>;
该代码现在可以安全地显示在页面上或电子邮件内。
当用户提交表单时,我们还会做两件事:
下一步是创建一个函数来为我们完成所有检查(这比一遍又一遍地编写相同的代码方便得多)。
我们将函数命名为 test_input()。
现在,我们可以使用 test_input() 函数检查每个 $_POST 变量,脚本如下所示:
<?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"]);
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
运行示例 »
请注意,在脚本的开头,我们检查表单是否已使用 $_SERVER["REQUEST_METHOD"] 提交。如果 REQUEST_METHOD 是 POST,则表单已提交 - 并且应该对其进行验证。如果尚未提交,则跳过验证并显示空白表单。
但是,在上面的示例中,所有输入字段都是可选的。即使用户不输入任何数据,该脚本也可以正常工作。
下一步是将输入字段设置为必填字段,并根据需要创建错误消息。
截取页面反馈部分,让我们更快修复内容!也可以直接跳过填写反馈内容!