本来一个小小的表单的参数传递时非常简单的,是基础的基础,但是考虑到现在网上的不法分子越来越猖獗,而且那些平时没事做一心钻研黑客技术的人越来越多,你在表单提交之前,首先就应该在前台中处理一下,后台部分的当然也要处理sql注入的问题,不过本文主要讨论前台表单参数传递的问题。真不知道那些一心黑别人网站的人是怎么样,以为自己的技术很牛逼的样子,其实,有这么强的技术,就应该好好找份工作拿拿高薪,而不是专注黑客一万年,为难一些小网站的程序猿。程序猿何苦为难程序猿呢?同是猿猴罢了。
一、基本目标
首先,没有转义字符,导致网页崩溃的问题,如果不处理,下面的提交的结果是出现一个提交按钮……
这部分在《【JavaScript】某些字符不转义可以导致网页崩溃与涉及转义字符的显示方法》(点击打开链接)已经讨论过了,这里只是拿出来综合起来而已。
然后,字数检查的问题,输入的内容是否为空的问题需要检测。字数即时检查如何做出来,在《【JavaScript】多输入框的输入字数即时检查》(点击打开链接)已经讨论过,其中的核心技术可以看《【JavaScript】仿新浪微博原生态兼容IE6的输入字数即时检查》(点击打开链接)。当然,除了在表单提交之前还需要再一次的判断。否则如果你这些东西要连入数据库的话,很可能会导致数据库的数据插入异常。
二、基本思想
反正一个表单的提交,在提交之前,除了前台做完必要的检查《【JavaScript】表单即时验证,不成功不让提交》(点击打开链接),还需要进行最后的三部曲:
1、输入框是否空
2、输入框输入的东西是否超过了字数
3、输入框的字符是否已经转义,再入库,否则<html>等HTML代码可能会导致网页的崩溃。
至于怎么完成表单之间的参数传递,就不是本文讨论的重点了。具体可以看:
asp也就是vbscript版的《【ASP】连接Access数据库的登陆系统》(点击打开链接)
aspx也就是aps.net当时候还没有写编辑记录的习惯,忘记记下来了。
jsp版的请看《【Filter】利用过滤器Filter解决post传递的编码问题与利用EL表达式简化参数传递》(点击打开链接)
php则请看《【php】基本语法与页面之间数值传递》(点击打开链接)
我都写过,都是一些很基础的东西!
三、制作过程
1、HTML部分
页面布局与《【JavaScript】多输入框的输入字数即时检查》(点击打开链接)的完全相同,不过在表单提交的地方增加了onsubmit的属性,要是这东西return false表单就不能提交,return true就可以提交,不写则默认return true,要求其提交之前必须进行判断。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>form</title>
</head>
<body>
<form method="post" action="result.jsp" onsubmit="return check()">
<p id="testtitle"></p>
<span id="wordLengthtitle" style="font-family:Georgia;">0/10</span>
标题:<input type="text" name="title" id="title" onkeyup="inputTest(this.id,this.value)"/><br />
<p id="testcontent"></p>
<span id="wordLengthcontent" style="font-family:Georgia;">0/50</span>
内容:<textarea id="content" onkeyup="inputTest(this.id,this.value)" rows="10" name="content"></textarea><br />
<input type="submit" value="提交" />
</form>
</body>
</html>
2、核心脚本javascript部分
除了在《【JavaScript】多输入框的输入字数即时检查》(点击打开链接)与《【JavaScript】某些字符不转义可以导致网页崩溃与涉及转义字符的显示方法》(点击打开链接)里面的固有函数,也就是增加了一个onsubmit的函数:
<script>
//转义函数的开始
var keys = Object.keys || function(obj) {
obj = Object(obj)
var arr = []
for (var a in obj) arr.push(a)
return arr
}
var invert = function(obj) {
obj = Object(obj)
var result = {}
for (var a in obj) result[obj[a]] = a
return result
}
var entityMap = {
escape: {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
' ': '&nbsp;',
/*如果你之后的WEB程序还涉及到文件名,文件的操作,比如导入导出功能,你最好还是在这个映射表中再添加以下的规则,把半角转成全角,否则可能出错
'\\' : '\',
'/' : '/',
':' : ':',
'*' : '*',
'?' : '?',
'|' : '|',
*/
}
}
entityMap.unescape = invert(entityMap.escape);
var entityReg={
escape: RegExp('[' + keys(entityMap.escape).join('') + ']', 'g'),
unescape: RegExp('(' + keys(entityMap.unescape).join('|') + ')', 'g')
}
function HTMLescape(html) {
if (typeof html != 'string') return ''
return html.replace(entityReg.escape, function(match) {
return entityMap.escape[match]
})
}
function HTMLunescape(str) {
if (typeof str != 'string') return ''
return str.replace(entityReg.unescape, function(match) {
return entityMap.unescape[match]
})
}
//转义函数的结束
//获取长度函数
function getStrLength(str){
var mylen=0;
for(var i=0;i<str.length;i++){
if(str.charCodeAt(i)>0&&str.charCodeAt(i)<128){
mylen++;
}else{
mylen+=2;
}
}
return mylen;
}
//输入当字符数变更就触发这个函数
function inputTest(id,value){
if(id=="title"){
document.getElementById("wordLength"+id).innerHTML=parseInt(getStrLength(HTMLescape(value))/2)+"\/10";
}
else{
document.getElementById("wordLength"+id).innerHTML=parseInt(getStrLength(HTMLescape(value))/2)+"\/50";
}
if(id=="title"){
if(parseInt(getStrLength(HTMLescape(value)))>20){
document.getElementById("test"+id).style.display="block";
document.getElementById("test"+id).innerHTML="太长,请修改至10字之内";
document.getElementById("test"+id).style.color="#ff0000";
}
else{
document.getElementById("test"+id).innerHTML="";
document.getElementById("test"+id).style.display="none";
}
}
else{
if(parseInt(getStrLength(HTMLescape(value)))>100){
document.getElementById("test"+id).style.display="block";
document.getElementById("test"+id).innerHTML="太长,请修改至50字之内";
document.getElementById("test"+id).style.color="#ff0000";
}
else{
document.getElementById("test"+id).innerHTML="";
document.getElementById("test"+id).style.display="none";
}
}
}
//表单提交之前的验证,与字符转义
function check() {
//首先获取标题、内容,然后马上对其进行转义
var title=document.getElementById("title").value;
var content=document.getElementById("content").value;
title=HTMLescape(title)+"";
content=HTMLescape(content)+"";
//通过各种方法来检查其长度,减少绕过判空判断的可能性
if(title.length==0||title==""||parseInt(getStrLength(title))==0){
alert("标题不能为空");
return false;
}
if(content.length==0||content==""||parseInt(getStrLength(content))==0){
alert("内容不能为空");
return false;
}
//因为这里要统计字符数是否超过10个汉字,20个字符,所以仅能使用自己编写的getStrLength
//length则汉字、英文都算一个字符
if(parseInt(getStrLength(title))>20){
alert("标题不能多于10个汉字");
return false;
}
if(parseInt(getStrLength(content))>100){
alert("内容不能多于50个汉字");
return false;
}
//把转义的内容覆盖表单原来的值再提交,这样就不会出现HTML使网页崩溃这些问题了。
document.getElementById("title").value=title;
document.getElementById("content").value=content;
return true;
}
</script>
以上就是前台验证表单的整个过程,当然后台中也要对sql注入进行防范,如果网上没有那群别有用心的黑客,根本就不用写这么长的代码!