表单处理
GET vs. POST
1 GET 和 POST 都创建数组(例如,array( key => value, key2 => value2, key3 => value3, ...))。此数组包含键/值对,其中的键是表单控件的名称,而值是来自用户的输入数据。
2 GET 和 POST 被视作 $_GET 和 $_POST。它们是超全局变量,这意味着对它们的访问无需考虑作用域 - 无需任何特殊代码,您能够从任何函数、类或文件访问它们。
3 传递方式
$_GET 是通过 URL 参数传递到当前脚本的变量数组。
$_POST 是通过 HTTP POST 传递到当前脚本的变量数组。
(1)何时使用 GET?
通过 GET 方法从表单发送的信息对任何人都是可见的(所有变量名和值都显示在 URL 中)。GET 对所发送信息的数量也有限制。限制在大约 2000 个字符。
GET 可用于发送非敏感的数据。
注释:绝不能使用 GET 来发送密码或其他敏感信息!
(2)何时使用 POST?
通过 POST 方法从表单发送的信息对其他人是不可见的(所有名称/值会被嵌入 HTTP 请求的主体中),并且对所发送信息的数量无限制。
此外 POST 支持高阶功能,比如在向服务器上传文件时进行 multi-part 二进制输入。
提示:开发者偏爱 POST 来发送表单数据。
表单验证
htmlspecialchars() 函数
如果要将表单提交给页面本身,而不是跳转到另一张页面。这样,用户就能够在表单页面获得错误提示信息。
表单的 HTML 代码是这样的:
1
|
< form method = "post" action = "<?php echo htmlspecialchars($_SERVER[" PHP_SELF"]);?>">
|
(1)什么是 $_SERVER["PHP_SELF"] 变量?
$_SERVER["PHP_SELF"] 是一种超全局变量,它返回当前执行脚本的文件名。
因此,$_SERVER["PHP_SELF"] 将表单数据发送到页面本身,而不是跳转到另一张页面。这样,用户就能够在表单页面获得错误提示信息。
(2)什么是 htmlspecialchars() 函数?
htmlspecialchars() 函数把特殊字符转换为 HTML 实体。这意味着 < 和 > 之类的 HTML 字符会被替换为 < 和 > ,页面效果仍是< >。这样可防止攻击者通过在表单中注入 HTML 或 JavaScript 代码(跨站点脚本攻击)对代码进行利用。
如果没有 htmlspecialchars() 函数
hacker输入url:
1
|
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
|
表单处则会转换为:
1
|
< form method = "post" action = "test_form.php" />< script >alert('hacked')</ script >
|
典型反射xss
表单检查函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?php
// 定义变量并设置为空值
$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 ;
}
?>
|
必填字段 验证 E-mail 和 URL
1.验证名字
以下代码展示的简单方法检查 name 字段是否包含字母和空格。如果 name 字段无效,则存储一条错误消息:
1
2
3
4
|
$name = test_input( $_POST [ "name" ]);
if (!preg_match( "/^[a-zA-Z ]*$/" , $name )) {
$nameErr = "只允许字母和空格!" ;
}
|
2.验证 E-mail
以下代码展示的简单方法检查 e-mail 地址语法是否有效。如果无效则存储一条错误消息:
1
2
3
4
|
$email = test_input( $_POST [ "email" ]);
if (!preg_match( "/([\w\-]+\@[\w\-]+\.[\w\-]+)/" , $email )) {
$emailErr = "无效的 email 格式!" ;
}
|
3.验证 URL
以下代码展示的方法检查 URL 地址语法是否有效(这条正则表达式同时允许 URL 中的斜杠)。如果 URL 地址语法无效,则存储一条错误消息:
1
2
3
4
5
|
$website = test_input( $_POST [ "website" ]);
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%
=~_|]/i", $website )) {
$websiteErr = "无效的 URL" ;
}
|
完成表单实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
<!DOCTYPE HTML>
<html>
<head>
<style>
.error {color: #FF0000;}
</style>
</head>
<body>
<?php
// 定义变量并设置为空值
$nameErr = $emailErr = $genderErr = $websiteErr = "" ;
$name = $email = $gender = $comment = $website = "" ;
if ( $_SERVER [ "REQUEST_METHOD" ] == "POST" ) {
if ( empty ( $_POST [ "name" ])) {
$nameErr = "姓名是必填的" ;
} else {
$name = test_input( $_POST [ "name" ]);
// 检查姓名是否包含字母和空白字符
if (!preg_match( "/^[a-zA-Z ]*$/" , $name )) {
$nameErr = "只允许字母和空格" ;
}
}
if ( empty ( $_POST [ "email" ])) {
$emailErr = "电邮是必填的" ;
} else {
$email = test_input( $_POST [ "email" ]);
// 检查电子邮件地址语法是否有效
if (!preg_match( "/([\w\-]+\@[\w\-]+\.[\w\-]+)/" , $email )) {
$emailErr = "无效的 email 格式" ;
}
}
if ( empty ( $_POST [ "website" ])) {
$website = "" ;
} else {
$website = test_input( $_POST [ "website" ]);
// 检查 URL 地址语法是否有效(正则表达式也允许 URL 中的斜杠)
if (!preg_match( "/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i" , $website )) {
$websiteErr = "无效的 URL" ;
}
}
if ( empty ( $_POST [ "comment" ])) {
$comment = "" ;
} else {
$comment = test_input( $_POST [ "comment" ]);
}
if ( empty ( $_POST [ "gender" ])) {
$genderErr = "性别是必选的" ;
} else {
$gender = test_input( $_POST [ "gender" ]);
}
}
function test_input( $data ) {
$data = trim( $data );
$data = stripslashes ( $data );
$data = htmlspecialchars( $data );
return $data ;
}
?>
<h2>PHP 验证实例</h2>
<p><span class = "error" >* 必需的字段</span></p>
<form method= "post" action= "<?php echo htmlspecialchars($_SERVER[" PHP_SELF "]);?>" >
姓名:<input type= "text" name= "name" >
<span class = "error" >* <?php echo $nameErr ;?></span>
<br><br>
电邮:<input type= "text" name= "email" >
<span class = "error" >* <?php echo $emailErr ;?></span>
<br><br>
网址:<input type= "text" name= "website" >
<span class = "error" ><?php echo $websiteErr ;?></span>
<br><br>
评论:<textarea name= "comment" rows= "5" cols= "40" >
|
以上就是PHP表单相关知识总结的详细内容,更多关于PHP表单的资料请关注服务器之家其它相关文章!
原文链接:https://www.cnblogs.com/chengxiao/p/6129630.html