关于表单项更新检测,后台按需更新

泡泡鱼_ 2012-09-13 12:10:01
今天有个人问到这个,用来检测当前表单项哪些值需要更新,后台按需更新。
突然发现这个东东貌似还真有点用,按那位朋友在网上找到的代码做了些修改。
只要把得到的tips中的连接符&换成,号,岂不是就是一条update语句出来了。。
大家瞅瞅,这鬼东东严谨不?会不会一用这东东就又多出个漏洞来。暂时木有想到
<script  type="text/javascript">
Array.prototype.inArray=function (value){for (var i=0;i<this.length;i++){if (this[i] == value){return true;}}return false};
function IsFormChanged(el) {
var tips="";
var arr1=new Array();
var arr2=new Array();
var isChanged=false;
var itemVal='';
var form = document.getElementById(el);
for (var i = 0; i < form.elements.length; i++) {
var element = form.elements[i];
var type = element.type;
switch(type){
case "text":
case "hidden":
case "textarea":
case "button":
tips += (element.value != element.defaultValue)?tips.length==0?element.name+"='"+escape(element.value)+"'":"&"+element.name+"='"+escape(element.value)+"'":"";
break;
case "radio":
if(!arr1.inArray(element.name)){
arr1.push(element.name);
var myRadio=document.getElementsByName(element.name);
for(var k=0;k<myRadio.length;k++){
tips += (myRadio[k].checked && !myRadio[k].defaultChecked)?tips.length==0?myRadio[k].name+"='"+myRadio[k].value+"'":"&"+myRadio[k].name+"='"+myRadio[k].value+"'":"";
}
}
break;
case "checkbox":
if(!arr2.inArray(element.name)){
arr2.push(element.name);
isChanged=false;
var myBox=document.getElementsByName(element.name);
itemVal='';
for(var k=0;k<myBox.length;k++){
if(myBox[k].checked){//当前checkbox被选中
if(!myBox[k].defaultChecked){isChanged=true}//是否与初始状态不同,如果是则标记为当前checkbox需更新
itemVal += itemVal.length==0?myBox[k].value:","+myBox[k].value;//同一name追加值
}else{
if(myBox[k].defaultChecked){
isChanged=true;//初始化时为选中状态但当前未选中,标记该复选框组值需更新
}
}
}
if(isChanged){itemVal=element.name+"='"+itemVal+"'";tips+=tips.length==0?itemVal:'&'+itemVal}
}
break;
case "select-one":
for (var j = 0; j < element.options.length; j++) {
tips += (element.options[j].selected && !element.options[j].defaultSelected)?tips.length==0?element.name+"='"+element.value+"'":"&"+element.name+"='"+element.value+"'":"";
}
break;
case "select-multiple":
isChanged=false;
itemVal='';
for (var j = 0; j < element.options.length; j++) {
if(element.options[j].selected){
if(!element.options[j].defaultSelected){isChanged=true}//是否与初始状态不同,如果是则标记为当前select需更新
itemVal +=itemVal.length==0?element.options[j].value:","+element.options[j].value;//同一个元素只追加值
}else{
if(element.options[j].defaultSelected){
isChanged=true;//初始化时为选中状态但当前未选中,标记该select值需更新
}
}
}
if(isChanged){itemVal=element.name+"='"+itemVal+"'";tips+=tips.length==0?itemVal:'&'+itemVal}
break;
}
}
tips.length==0?alert('没有更新项'):alert(tips);
}
</script>
<form id="chageform" action="">
text:<input type="text" name="txt1" value="1"/><br />
myBox:<input type="checkbox" name="myBox" checked="checked" value="1"/>
<input type="checkbox" name="myBox" value="2"/>
<input type="checkbox" name="myBox" value="3"/><br />

myBox2:<input type="checkbox" name="myBox2" checked="checked" value="4"/>
<input type="checkbox" name="myBox2" checked="checked" value="5"/>
<input type="checkbox" name="myBox2" value="6"/><br />

myRadio:<input type="radio" name="myRadio" checked="checked" value="1"/>
<input type="radio" name="myRadio" value="2"/><br />

myRadio2:<input type="radio" name="myRadio2" value="1"/>
<input type="radio" name="myRadio2" checked="checked" value="2"/><br />

mySel:<select name="mySel">
<option value="1" selected="selected">1</option>
<option value="2">2</option>
</select><br />

mySel2:<select name="mySel2">
<option value="1">1</option>
<option value="2" selected="selected">2</option>
</select><br />

mySel3:<select name="mySel3" multiple="multiple" style="width:50px;">
<option value="1">1</option>
<option value="2" selected="selected">2</option>
<option value="3">3</option>
<option value="4" selected="selected">4</option>
<option value="5">5</option>
</select><br />

mySel4:<select name="mySel4" multiple="multiple" style="width:50px;">
<option value="1">1</option>
<option value="2" selected="selected">2</option>
<option value="3">3</option>
<option value="4" selected="selected">4</option>
</select><br />
<input type="button" value="检测" onclick="IsFormChanged('chageform')" />
</form>
...全文
243 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
未知数 2012-09-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
引用 2 楼 的回复:
严不严谨自己从逻辑上仔细想想不就清楚了?
如果输入都进行验证了的话是不会有问题,否没有验证的话,可能有以下问题:
1.空字符串,如果数据库需要数值类型数据,空字符串默认转换为数值是会失败的,语句将失败
2.单引号,单引号在sql语句中表示字符串,如果字符串本身包括单引号,会提前结束字符串导致语句错误
其他暂时没想到,sql关键字的话由于在单引号内该没有问题。

……
[/Quote]
对,服务器有验证就好了
另:js注入是不能避免的,就算是局部变量不好注入js改变(当然实际上js注入可以直接改变整个函数,所以局部变量也不保险),还有调试工具,打个断点就可以任意修改你要提交的字符串了

可以做成一个字符串传到后台但后台不能直接用,要解析,验证才好
泡泡鱼_ 2012-09-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
反正不要相信客户端提交的数据就行了,服务器要再验证一遍,其他不用多说
[/Quote]
PS一下,俺从来就不相信客户端提交的数据的。把自己想笨一点从来是我的原则
泡泡鱼_ 2012-09-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
反正不要相信客户端提交的数据就行了,服务器要再验证一遍,其他不用多说
[/Quote]

这个是必须的一个环节,我说的那种转化成sql语句的意思其实是想体现在按需更新这个意思上面

至少,我检测到没有表单项发生变更,我这个表单不用提交了,对数据库的操作又减少了

有变更项,提交后在服务器端做好相关验证,再动态构建一条更新的语句,也不用所有的字段都去更新了
泡泡鱼_ 2012-09-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
严不严谨自己从逻辑上仔细想想不就清楚了?
如果输入都进行验证了的话是不会有问题,否没有验证的话,可能有以下问题:
1.空字符串,如果数据库需要数值类型数据,空字符串默认转换为数值是会失败的,语句将失败
2.单引号,单引号在sql语句中表示字符串,如果字符串本身包括单引号,会提前结束字符串导致语句错误
其他暂时没想到,sql关键字的话由于在单引号内该没有问题。

除了代码逻辑问题,还有的……
[/Quote]
这个功能就是检测出哪些项的值或状态被更新过,空字符串和sql语句的问题应该没有问题。一来所有字符串均在单引号内,二来所有值也经过了escape()编码

至于js注入的话,我暂时没想到有什么方法可以对它进行js注入,因为它检测的是初始值的变化,至于说当成sql语句,这个只是这么一说。或许我提交至服务器端后再经过一次有效性验证,就应该没有这样的问题了
Go 旅城通票 2012-09-13
  • 打赏
  • 举报
回复
反正不要相信客户端提交的数据就行了,服务器要再验证一遍,其他不用多说
未知数 2012-09-13
  • 打赏
  • 举报
回复
严不严谨自己从逻辑上仔细想想不就清楚了?
如果输入都进行验证了的话是不会有问题,否没有验证的话,可能有以下问题:
1.空字符串,如果数据库需要数值类型数据,空字符串默认转换为数值是会失败的,语句将失败
2.单引号,单引号在sql语句中表示字符串,如果字符串本身包括单引号,会提前结束字符串导致语句错误
其他暂时没想到,sql关键字的话由于在单引号内该没有问题。

除了代码逻辑问题,还有的就是安全问题了,有严重安全隐患
直接将前台一个字符串作为sql语句,这个太危险了,要知道前台的值都是可以通过调试工具或者地址栏js注入任意操纵的,或许别人会做一个删除数据库表的sql给你执行呢
laiyilong 2012-09-13
  • 打赏
  • 举报
回复
刚才没认真看楼主的意思,如果直接这样得到update语句的话的确感觉很危险,我的原意是想把整理后的用&连起来然后就可以ajax post到服务器了
laiyilong 2012-09-13
  • 打赏
  • 举报
回复
这个检测只是过滤了没修改的值,其他值post上去以后当然还要验证了,这本来就是要做的事情,最起码服务器减轻了嘛,这样就能提高点效率,之前的代码我基本看懂了,我也想到应该可以改进而不需要手动添加radio的参数,你更新的代码应该已经解决这个问题了,呵呵呵

87,901

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧