在运行Javascript脚本并通过正则表达式对用户的注册信息进行验证时,虽然可以在客户端对用户输入的信息进行控制,并且还减轻了服务器的压力,但是也带来一些安全隐患。
如果某个用户利用Javascript是在客户端执行的特点,将网站的注册页面保存到本地,并对这个本地静态HTML文件稍加修改,去掉其中应用Javascript判断输入信息是否合理的部分,并重新设置form表单的提交路径,那么运行本地的静态HTML文件就可以实现用户注册的功能。而此时不会有任何对输入信息的限制,无论输入什么内容都能注册成功。
这就是我们所说的越过表单进行文件上传,其主要是利用了Javascript在客户端执行的特点,虽然可以在页面内部限制用户的输入,但是不能限制其他表单对页面的提交。
而我们这里将介绍一种防护措施,从而可以避免出现这种越过表单上传文件的漏洞,那就是在表单处理页和数据表的字段类型中做文章。
首先,在表单处理页中通过正则表达式再次对提交的数据进行验证,这一关他是无论如何都躲不过去的。要在表单处理页应用正则表达式对提交的数据进行验证,就应用正则表达式preg_match()。完整代码如下:
function.php:
<?php
function gtel($gtel){
$check="/^(\d{3}-)(\d{8})$|^(\d{4}-)(\d{7})$|^(\d{4}-)(\d{8})$/"; //定义验证座机号码的正则表达式
$bool=preg_match($check,$gtel,$counts); //应用preg_match验证参数的格式是否正确
return $bool; //返回变量值
}
function mtel($mtel){
$check="/^13(\d{9})$|^15(\d{9})$|^189(\d{8})$/"; //定义验证手机号码的正则表达式
$bool=preg_match($check,$mtel,$counts);
return $bool;
}
function email($email){
$check="/\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/"; //定义验证email的正则表达式
$bool=preg_match($check,$email,$counts);
return $bool;
}
function postalcode($postalcode){
$check="/\d{6}/"; //定义验证邮编的正则表达式
$bool=preg_match($check,$postalcode,$counts);
return $bool;
}
?>
index.php:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title> 在JavaScript脚本中通过正则表达式验证用户注册信息</title>
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<script src="js/check.js"></script>
<body>
<table width="1014" height="706" border="0" align="center" cellpadding="0" cellspacing="0" background="images/form1.jpg">
<tr>
<td width="133" height="228"> </td>
<td width="750"> </td>
<td width="113"> </td>
</tr>
<tr>
<td> </td>
<td align="center" valign="top">
<form name="form_reg" method="post" action="index_ok.php" onSubmit="return chkreginfo(form_reg,'all&