表单处理
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 代码是这样的:
<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:
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>
典型反射xss
表单检查函数:
<?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 字段无效,则存储一条错误消息:
$name = test_input($_POST[\"name\"]); if (!preg_match(\"/^[a-zA-Z ]*$/\",$name)) { $nameErr = \"只允许字母和空格!\"; }
2.验证 E-mail
以下代码展示的简单方法检查 e-mail 地址语法是否有效。如果无效则存储一条错误消息:
$email = test_input($_POST[\"email\"]); if (!preg_match(\"/([\\w\\-]+\\@[\\w\\-]+\\.[\\w\\-]+)/\",$email)) { $emailErr = \"无效的 email 格式!\"; }
3.验证 URL
以下代码展示的方法检查 URL 地址语法是否有效(这条正则表达式同时允许 URL 中的斜杠)。如果 URL 地址语法无效,则存储一条错误消息:
$website = test_input($_POST[\"website\"]); if (!preg_match(\"/\\b(?:(?:https?|ftp):\\/\\/|www\\.)[-a-z0-9+&@#\\/%?=~_|!:,.;]*[-a-z0-9+&@#\\/% =~_|]/i\",$website)) { $websiteErr = \"无效的 URL\"; }
完成表单实例
<!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表单的资料请关注免费资源网其它相关文章!
暂无评论内容