phpecho$_SERVER["PHP_SELF"];?
>">
1
现在,如果用户进入的是地址栏中正常的URL:
“
1
到目前,一切正常。
不过,如果用户在地址栏中键入了如下URL:
1
在这种情况下,上面的代码会转换为:
1
这段代码加入了一段脚本和一个提示命令。
并且当此页面加载后,就会执行JavaScript代码(用户会看到一个提示框)。
这仅仅是一个关于PHP_SELF变量如何被利用的简单无害案例。
您应该意识到">
1
无法利用,没有危害!
通过PHP验证表单数据
我们要做的第一件事是通过PHP的htmlspecialchars()函数传递所有变量。
在我们使用htmlspecialchars()函数后,如果用户试图在文本字段中提交以下内容:
1
代码不会执行,因为会被保存为转义代码,就像这样:
<script>location.href('')</script>
1
现在这条代码显示在页面上或e-mail中是安全的。
在用户提交该表单时,我们还要做两件事:
(通过PHPtrim()函数)去除用户输入数据中不必要的字符(多余的空格、制表符、换行)
(通过PHPstripslashes()函数)删除用户输入数据中的反斜杠(\)
接下来我们创建一个检查函数(相比一遍遍地写代码,这样效率更好)。
我们把函数命名为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"]);
}
functiontest_input($data){
$data=trim($data);
$data=stripslashes($data);
$data=htmlspecialchars($data);
return$data;
}
?
>
请注意在脚本开头,我们检查表单是否使用$_SERVER[“REQUEST_METHOD”]进行提交。
如果REQUEST_METHOD是POST,那么表单已被提交-并且应该对其进行验证。
如果未提交,则跳过验证并显示一个空白表单。
PHP表单验证-必填字段
本节展示如何制作必填输入字段,并创建需要时所用的错误消息。
PHP-输入字段
从上一节中的验证规则中,我们看到“Name”,“E-mail”以及“Gender”字段是必需的。
这些字段不能为空且必须在HTML表单中填写。
在上一节中,所有输入字段都是可选的。
在下面的代码中我们增加了一些新变量:
$nameErr、$emailErr、$genderErr以及$websiteErr。
这些错误变量会保存被请求字段的错误消息。
我们还为每个$_POST变量添加了一个ifelse语句。
这条语句检查$_POST变量是否为空(通过PHPempty()函数)。
如果为空,则错误消息会存储于不同的错误变量中。
如果不为空,则通过test_input()函数发送用户输入数据:
php
//定义变量并设置为空值
$nameErr=$emailErr=$genderErr=$websiteErr="";
$name=$email=$gender=$comment=$website="";
if($_SERVER["REQUEST_METHOD"]=="POST"){
if(empty($_POST["name"])){
$nameErr="Nameisuired";
}else{
$name=test_input($_POST["name"]);
}
if(empty($_POST["email"])){
$emailErr="Emailisrequired";
}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="Genderisrequired";
}else{
$gender=test_input($_POST["gender"]);
}
}
?
>
PHP-显示错误消息
在HTML表单中,我们在每个被请求字段后面增加了一点脚本。
如果需要,会生成恰当的错误消息(如果用户未填写必填字段就试图提交表单):
phpechohtmlspecialchars($_SERVER["PHP_SELF"]);?
>">
Name:
*
phpecho$nameErr;?
>
E-mail:
*
phpecho$emailErr;?
>
Website:
phpecho$websiteErr;?
>
Gender:
Female
Male
*
phpecho$genderErr;?
>
接下来是验证输入数据,即“Name字段是否只包含字母和空格?
”,以及“E-mail字段是否包含有效的电子邮件地址语法?
”,并且如果填写了Website字段,“这个字段是否包含了有效的URL?
”。
PHP表单验证-验证E-mail和URL
本节展示如何验证名字、电邮和URL。
PHP-验证名字
以下代码展示的简单方法检查name字段是否包含字母和空格。
如果name字段无效,则存储一条错误消息:
$name=test_input($_POST["name"]);
if(!
preg_match("/^[a-zA-Z]*$/",$name)){
$nameErr="只允许字母和空格!
";
}
注释:
preg_match()函数检索字符串的模式,如果模式存在则返回true,否则返回false。
(正则表达式)
PHP-验证E-mail
以下代码展示的简单方法检查e-mail地址语法是否有效。
如果无效则存储一条错误消息:
$email=test_input($_POST["email"]);
if(!
preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)){
$emailErr="无效的email格式!
";
}
PHP-验证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";
}
PHP-验证Name、E-mail、以及URL
现在,脚本是这样的:
php
//定义变量并设置为空值
$nameErr=$emailErr=$genderErr=$websiteErr="";
$name=$email=$gender=$comment=$website="";
if($_SERVER["REQUEST_METHOD"]=="POST"){
if(empty($_POST["name"])){
$nameErr="Nameisrequired";
}else{
$name=test_input($_POST["name"]);
//检查名字是否包含字母和空格
if(!
preg_match("/^[a-zA-Z]*$/",$name)){
$nameErr="Onlylettersandwhitespaceallowed";
}
}
if(empty($_POST["email"])){
$emailErr="Emailisrequired";
}else{
$email=test_input($_POST["email"]);
//检查电邮地址语法是否有效
if(!
preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)){
$emailErr="Invalidemailformat";
}
}
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="InvalidURL";
}
}
if(empty($_POST["comment"])){
$comment="";
}else{
$comment=test_input($_POST["comment"]);
}
if(empty($_POST["gender"])){
$genderErr="Genderisrequired";
}else{
$gender=test_input($_POST["gender"]);
}
}
?
>
接下来向您讲解如何防止表单在用户提交表单后保留输入字段中的值。
PHP-保留表单中的值
如需在用户点击提交按钮后在输入字段中显示值,我们在以下输入字段的value属性中增加了一小段PHP脚本:
name、email以及website。
在comment文本框字段中,我们把脚本放到了之间。
这些脚本输出$name、$email、$website和$comment变量的值。
然后,我们还需要显示选中了哪个单选按钮。
对此,我们必须操作checked属性(而非单选按钮的value属性):
Name:
phpecho$name;?
>">
E-mail:
phpecho$email;?
>">
Website:
phpecho$website;?
>">
Comment:
phpecho$comment;?
>
Gender:
phpif(isset($gender)&&$gender=="female")echo"checked";?
>
value="female">Female
phpif(isset($gender)&&$gender=="male")echo"checked";?
>
value="male">Male