这和下面的章节展示了如何使用PHP来验证表单数据。
PHP表单验证
处理PHP表单时认为安全性!
这些页面将展示如何处理PHP形式考虑到安全性。 表单数据的适当的验证是非常重要的保护您的形式从黑客和垃圾邮件发送者!
HTML表单,我们将在这些章节中的工作,包括各种输入字段:必需和可选的文本字段,单选按钮,和一个提交按钮:
上述形式的验证规则如下:
领域 | 验证规则 |
---|---|
名称 | 需要。 +只能包含字母和空格 |
电子邮件 | 需要。 +必须包含一个有效的电子邮件地址(with @ and .) |
网站 | 可选的。 如果存在,它必须包含一个有效的URL |
评论 | 可选的。 多行输入字段(textarea) |
性别 | 需要。 必须选择一个 |
首先,我们将着眼于为形式的纯HTML的代码:
文本字段
姓名,电子邮件和网站字段是文本输入元素,注释字段是一个textarea。 在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
表单元素
表单的HTML代码如下所示:
<form method="post" action="<?php echo
htmlspecialchars($_SERVER["PHP_SELF"]);?>">
当表单提交,表单数据与方法=“POST”发送。
什么是$ _SERVER [ “PHP_SELF”]变量?
该$ _ SERVER [“PHP_SELF”]是一个超级全局变量返回当前执行脚本的文件名。
所以,$ _ SERVER [“PHP_SELF”]提交的表单数据发送到页面本身,而不是跳转到不同的页面。 通过这种方式,用户将得到相同的页面表单上的错误消息。
什么是htmlspecialchars()函数?
该htmlspecialchars()函数的特殊字符转换为HTML实体。 这意味着它将替换的HTML字符像<和>以&lt; 和取代。 这可以防止攻击者通过注入HTML或JavaScript代码利用的代码(Cross-site Scripting attacks)的形式。
在PHP形式的担保大注意事项
该$ _ SERVER [“PHP_SELF”]变量可以被黑客使用!
如果PHP_SELF在您的网页使用,那么用户可以输入一个斜杠(/)然后一些跨站点脚本(XSS)命令来执行。
跨站点脚本(XSS)是一种类型的计算机安全漏洞,通常在Web应用程序中。 XSS允许攻击者注入客户端脚本到其他用户浏览过的网页。
假设我们有一个名为页面下面的表格"test_form.php" :
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
现在,如果用户输入在像地址栏中的正常URL "http://www.example.com/test_form.php" ,上面的代码将被转换为:
<form method="post" action="test_form.php">
到现在为止还挺好。
然而,考虑到用户输入在地址栏中输入以下网址:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
在这种情况下,上面的代码将被转换为:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
该代码添加一个脚本标记和警报命令。 而在页面加载时,JavaScript代码会被执行(the user will see an alert box) 。 这只是一个简单的和无害例如PHP_SELF变量如何被利用的。
要注意的是任何JavaScript代码可以在里面添加<script>标记! 黑客可以将用户重定向到另一台服务器上的文件,而该文件可以保存恶意代码,可以改变全局变量或提交表单到另一个地址保存用户数据,例如。
如何避免$ _ SERVER [“PHP_SELF”]漏洞?
$ _SERVER [ “PHP_SELF”]漏洞可以通过使用避免htmlspecialchars()函数。
表单代码应该是这样的:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
该htmlspecialchars()函数的特殊字符转换为HTML实体。 现在,如果用户试图利用这个PHP_SELF变量,它会导致下面的输出:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
该漏洞的尝试失败,并没有造成任何伤害!
验证表单数据用PHP
我们会做的第一件事是通过PHP的所有变量htmlspecialchars()函数。
当我们使用htmlspecialchars()函数; 那么,如果用户试图提交的文本字段中输入以下:
<SCRIPT>位置。 href('http://www.hacked.com') </ SCRIPT>
- 这将不会被执行,因为它会被保存为HTML代码逃脱,就像这样:
&LT;脚本&GT;位置。 href('http://www.hacked.com') &LT; /脚本&GT;
该代码现在是安全的网页上或内部电子邮件显示。
我们也将做两两件事,当用户提交表单:
- 条不必要的字符(extra space, tab, newline)从用户输入的数据(with the PHP trim()函数)
- 除去反斜杠(\)从用户输入的数据(with the PHP stripslashes()功能)
下一步是创建一个函数,将尽一切为我们检查(which is much more convenient than writing the same code over and over again) 。
我们将其命名为功能test_input()
现在,我们可以检查每个$ _ POST变量与test_input()函数,和脚本如下所示:
例
<?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,则表单已经提交 - 它应该进行验证。 如果它没有被提交,跳过验证,并显示一个空白表格。
然而,在上述的例子中,所有的输入字段是可选的。 即使用户不输入任何数据的脚本工作正常。
下一步是使所需的输入字段,如果需要创建错误消息。