深远通晓ajax体系第捌篇皇冠直营现金网官方网

前方的话

  在在此从前,网站的用户与后端交互的要害方法是由此HTML表单的选用。表单的引入在壹玖玖壹年,由于其简单性和易用性,直到电子商务出现在此以前从来保持着非常重要岗位。理利肠府单提交,对于更长远地领略ajax是有补益的。上面将详细介绍表单格局的竞相

 

建立表单

  表单处理是二个多线程。首先创造二个表单,以供用户输入详细的乞请新闻。接着,输入的数额被发送到网页服务器,在服务器里那个多少得到编写翻译和不当检查和测试。如若PHP代码标识出2个或八个必要珍视输入的字段,则含有相关错误音讯的表单会再也展现。当精确的输入信息满意代码的内需时,代码会选拔部分调用数据库的行为,如输入购物的底细

  [注意]至于HTML表单成分的详细音讯运动至此

  要白手起家七个表单,至少须求以下多少个成分:多少个form成分、一个点名GET或POST方法的交给项目、3个或多少个输入字段,以及表单数据交由的目标地址UKoleosL

<form action="http://www.w3school.com.cn/demo/welcome.php">
    Name:
    <input name="name"><br>
    Email:
    <input name="email"><br>
    <input type="submit">
</form>

 

表单处理

  PHP 超全局变量 $_GET 和 $_POST 用于收集表单数据(form-data)

  GET 和 POST 都创设数组(例如,array( key => value, key2 =>
value2, key3 => value3,
…))。此数组包蕴键/值对,当中的键是表单控件的称谓,而值是来自用户的输入数据。

  GET 和 POST 被视作 $_GET 和
$_POST。它们是超全局变量,那代表对它们的造访无需考虑成效域,即无需任何例外轮代理公司码,能够从此外函数、类或文件访问它们

  $_GET 是透过 U奥迪Q7L
参数字传送递到当前剧本的变量数组

  $_POST 是经过 HTTP POST
传递到当前剧本的变量数组

  通过 GET
方法从表单发送的音信对任哪个人都以可知的(全部变量名和值都呈现在 U奥迪Q5L
中)。GET对所发送消息的多少也有限量。限制在超出3000个字符。但是,由于变量呈现在
U福特ExplorerL 中,把页面添加到书签中也愈发便利

  通过 POST 方法从表单发送的新闻对别的人是不可知的(所出名称/值会被放到
HTTP 请求的核心中),并且对所发送新闻的数据也无界定。别的 POST
支持高阶功用,比如在向服务器上传文件时展开 multi-part
二进制输入。可是,由于变量未出示在 U本田UR-VL
中,也就无法将页面添加到书签。一般地,使用 POST 来发送表单数据

【post】

<!-- 提交页 -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<form method="post" action="http://www.w3school.com.cn/demo/welcome.php">
    Name:
    <input name="name"><br>
    Email:
    <input name="email"><br>
    <input type="submit">
</form>
</body>
</html>

<!-- 响应页 -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    Welcome <?php echo $_POST["name"]; ?><br>
    Your email address is: <?php echo $_POST["email"]; ?>
</body>
</html>

【get】

  假使不安装form元素的method属性,则默许为get方法

<!-- 提交页 -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<form action="http://www.w3school.com.cn/demo/welcome_get.php">
    Name:
    <input name="name"><br>
    Email:
    <input name="email"><br>
    <input type="submit">
</form>
</body>
</html>

<!-- 响应页 -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    Welcome <?php echo $_GET["name"]; ?><br>
    Your email address is: <?php echo $_GET["email"]; ?>
</body>
</html>

 

表单安全

  上边包车型地铁代码非常粗略。然而,最关键的内容被漏掉了。须要对表单数据开始展览认证,以防备脚本现身漏洞

  对 HTML 表单数据举办适量的表明对于预防黑客和垃圾邮件很主要

字段           验证规则
Name           必需。必须包含字母和空格。
E-mail         必需。必须包含有效的电子邮件地址(包含 @ 和 .)
Website        可选。如果选填,则必须包含有效的 URL。
Comment        可选。多行输入字段(文本框)
Gender         必需。必须选择一项。

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

姓名:
<input type="text" name="name" value="">
* 
<br><br>
电邮:
<input type="text" name="email" value="">
* 
<br><br>
网址:
<input type="text" name="website" value="">

<br><br>
<label>
评论:
<textarea name="comment" rows="5" cols="40"></textarea>
<br><br>
性别:
<input type="radio" name="gender" value="female">女性
<input type="radio" name="gender" value="male">男性
* 
<br><br>
<input type="submit" name="submit" value="提交"> 
</form>

【$_SERVER[“PHP_皇冠直营现金网官方网,SELF”]】

  $_SERVER[“PHP_SELF”]
是一种超全局变量,它回到当前施行脚本的文书名。因而,$_SERVER[“PHP_SELF”]
将表单数据发送到页面本人,而不是跳转到另一张页面。这样,用户就可见在表单页面获得错误提醒新闻

【XSS】

  $_SERVER[“PHP_SELF”]
变量能够被黑客利用。假若页面使用了PHP_SELF,用户能够输入下划线然后实施跨站点脚本(XSS)

  跨站点脚本(克罗丝-site
scripting,XSS)是一种总计机安全漏洞类型,常见于Web应用程序。XSS能够使攻击者向别的用户浏览的网页中输入客户端脚本

  假设”test_form.php” 的页面中有如下表单

<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

  今后,即使用户进入的是地点栏中寻常的UTiguanL:”http://www.example.com/test\_form.php",上面的代码会转换为:

<form method="post" action="test_form.php">

  可是,倘使用户在地点栏中键入了如下 U昂科雷L:

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>

  那段代码加入了一段脚本和3个升迁命令。并且当此页面加载后,就会实施JavaScript代码(用户会面到二个提醒框)。那无非是3个关于
PHP_SELF 变量如何被应用的大致没有害案例

  <script>标签内能够添加别的JavaScript代码,黑客能够把用户重定向到另一台服务器上的有些文件,该文件中的恶意代码能够改变全局变量或将表单提交到其余地方以保存用户数量等

【htmlspecialchars()】

  要是制止$_SERVER[“PHP_SELF”]被使用?通过应用
htmlspecialchars() 函数能够幸免$_SERVER[“PHP_SELF”]被利用

  htmlspecialchars()函数把特殊字符转换为 HTML 实体。那表示 < 和
> 之类的HTML字符会被交流为 < 和
>。那样可幸免攻击者通过在表单中流入HTML或JavaScript代码(跨站点脚本攻击)对代码进行利用

  表单代码是如此的:

<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的htmlspecialchars()函数字传送递全部变量。在利用htmlspecialchars()函数后,尽管用户准备在文本字段中付出以下内容:

<script>location.href('http://www.hacked.com')</script>

  代码不会实施,因为会被保留为转义代码,就像是这样:

&lt;script&gt;location.href('http://www.hacked.com')&lt;/script&gt;

  未来那条代码突显在页面上或e-mail中是安全的

  在用户提交该表单时,我们还要做两件事:一 、通过PHP的trim()函数去除用户输入数据中不须要的字符(多余的空格、制表符、换行);二 、通过PHP的stripslashes()函数删除用户输入数据中的反斜杠(\)

  接下去自个儿创立三个检查函数,命名为
test_input(),通过test_input()函数检查各类$_POST变量

<?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;
}
?>

 

错误音信

  在底下的代码中扩张了有些新变量:$nameErr、$emailErr、$genderErr以及$websiteErr。这一个不当变量会保留被呼吁字段的不当新闻。还为各样$_POST变量添加了2个if
else语句。那条语句通过PHP的empty()函数检查$_POST变量是或不是为空。借使为空,则错误新闻会储存于不相同的谬误变量中。即使不为空,则经过test_input()函数发送用户输入数据

<?php
// 定义变量并设置为空值
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  if (empty($_POST["name"])) {
    $nameErr = "Name is required";
  } else {
    $name = test_input($_POST["name"]);
  }

  if (empty($_POST["email"])) {
    $emailErr = "Email is required";
  } else {
    $email = test_input($_POST["email"]);
  }

  if (empty($_POST["website"])) {
    $website = "";
  } else {
    $website = test_input($_POST["website"]);
  }

  if (empty($_POST["comment"])) {
    $comment = "";
  } else {
    $comment = test_input($_POST["comment"]);
  }

  if (empty($_POST["gender"])) {
    $genderErr = "Gender is required";
  } else {
    $gender = test_input($_POST["gender"]);
  }
}
?>

  在 HTML
表单中,在种种被呼吁字段前边扩充了几许本子。若是急需,会转变稳当的一无所能消息(如若用户未填写必填字段就准备提交表单)

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

Name: <input type="text" name="name">
* <?php echo $nameErr;?>
<br><br>
E-mail:
<input type="text" name="email">
* <?php echo $emailErr;?>
<br><br>
Website:
<input type="text" name="website">
<?php echo $websiteErr;?>
<br><br>
<label>Comment: <textarea name="comment" rows="5" cols="40"></textarea>
<br><br>
Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male
* <?php echo $genderErr;?>
<br><br>
<input type="submit" name="submit" value="Submit"> 

</form>

 

表单验证

  验证规则中,”Name”, “E-mail” 以及 “Gender”
字段是少不了的。那么些字段不能够为空且必须在 HTML 表单中填入

【验证名字】

  以下代码检查name字段是还是不是含有字母和空格。假如name字段无效,则存款和储蓄一条错误音讯

$name = test_input($_POST["name"]);
if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
  $nameErr = "只允许字母和空格!"; 
}

【验证 E-mail】

  以下代码展检查e-mail地址语法是还是不是管用。要是无效则存款和储蓄一条错误信息

$email = test_input($_POST["email"]);
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) {
  $emailErr = "无效的 email 格式!"; 
}

【验证 URL】

  以下代码检查UPAJEROL地址语法是还是不是有效。要是 U中华VL
地址语法无效,则存款和储蓄一条错误音讯

$website = test_input($_POST["website"]);
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%
=~_|]/i",$website)) {
  $websiteErr = "无效的 URL"; 
}

 

保留值

  假使急需在用户点击提交按钮后在输入字段中展现值,大家在以下输入字段的value属性中加进了一小段
PHP 脚本:name、email 以及 website。在 comment
文本框字段中,把脚本放到了 <textarea> 与 </textarea>
之间。那么些脚本输出$name、$email、$website 和 $comment 变量的值

  然后,还亟需展现选中了哪些单选按钮。对此,必须操作 checked
属性(而非单选按钮的 value 属性)

Name: <input type="text" name="name" value="<?php echo $name;?>">

E-mail: <input type="text" name="email" value="<?php echo $email;?>">

Website: <input type="text" name="website" value="<?php echo $website;?>">

Comment: <textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea>

Gender:

<input type="radio" name="gender"
<?php if (isset($gender) && $gender=="female") echo "checked";?>
value="female">Female
<input type="radio" name="gender"
<?php if (isset($gender) && $gender=="male") echo "checked";?>
value="male">Male

 

表单发送

  HTML网页的<form>元素可以以八种格式,向服务器发送数据

  使用POST方法,将enctype属性设为application/x-www-form-urlencoded,那是默许方法

<form action="register.php" method="post" onsubmit="AJAXSubmit(this); return false;"></form>

  使用POST方法,将enctype属性设为text/plain

<form action="register.php" method="post" enctype="text/plain" onsubmit="AJAXSubmit(this); return false;"></form>

  使用POST方法,将enctype属性设为multipart/form-data

<form action="register.php" method="post" enctype="multipart/form-data" onsubmit="AJAXSubmit(this); return false;"></form>

  使用GET方法,enctype属性将被忽视

<form action="register.php" method="get" onsubmit="AJAXSubmit(this); return false;"></form>

  有个别表单有七个字段,分别是foo和baz,个中foo字段的值等于bar,baz字段的值是一个分为两行的字符串。上边多种办法,都足以将这些表单发送到服务器

  第2种办法是暗中同意方法,POST发送,Encoding
type为application/x-www-form-urlencoded

Content-Type: application/x-www-form-urlencoded
foo=bar&baz=The+first+line.&#37;0D%0AThe+second+line.%0D%0A

  第二种方法是POST发送,Encoding type为text/plain

Content-Type: text/plain

foo=bar
baz=The first line.
The second line.

  第二种艺术是POST发送,Encoding type为multipart/form-data

Content-Type: multipart/form-data; boundary=---------------------------314911788813839

-----------------------------314911788813839
Content-Disposition: form-data; name="foo"

bar
-----------------------------314911788813839
Content-Disposition: form-data; name="baz"

The first line.
The second line.

-----------------------------314911788813839--

  第多样办法是GET请求

?foo=bar&baz=The%20first%20line.%0AThe%20second%20line

 

完整代码

<!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;
}
?>

<p>* 必需的字段</p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 
   姓名:<input type="text" name="name" value="<?php echo $name;?>">
   * <?php echo $nameErr;?>
   <br><br>
   电邮:<input type="text" name="email" value="<?php echo $email;?>">
   * <?php echo $emailErr;?>
   <br><br>
   网址:<input type="text" name="website" value="<?php echo $website;?>">
   <?php echo $websiteErr;?>
   <br><br>
   评论:<textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea>
   <br><br>
   性别:
    <input type="radio" name="gender"
    <?php if (isset($gender) && $gender=="female") echo "checked";?>
    value="female">女性
    <input type="radio" name="gender"
    <?php if (isset($gender) && $gender=="male") echo "checked";?>
    value="male">男性

   * <?php echo $genderErr;?>
   <br><br>
   <input type="submit" name="submit" value="提交"> 
</form>
</body>
</html>

相关文章