首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

关于表单项更新检测,靠山按需更新

2012-09-18 
关于表单项更新检测,后台按需更新今天有个人问到这个,用来检测当前表单项哪些值需要更新,后台按需更新。突

关于表单项更新检测,后台按需更新
今天有个人问到这个,用来检测当前表单项哪些值需要更新,后台按需更新。
突然发现这个东东貌似还真有点用,按那位朋友在网上找到的代码做了些修改。
只要把得到的tips中的连接符&换成,号,岂不是就是一条update语句出来了。。
大家瞅瞅,这鬼东东严谨不?会不会一用这东东就又多出个漏洞来。暂时木有想到

HTML code
<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> 



[解决办法]
严不严谨自己从逻辑上仔细想想不就清楚了?
如果输入都进行验证了的话是不会有问题,否没有验证的话,可能有以下问题:
1.空字符串,如果数据库需要数值类型数据,空字符串默认转换为数值是会失败的,语句将失败
2.单引号,单引号在sql语句中表示字符串,如果字符串本身包括单引号,会提前结束字符串导致语句错误
其他暂时没想到,sql关键字的话由于在单引号内该没有问题。

除了代码逻辑问题,还有的就是安全问题了,有严重安全隐患
直接将前台一个字符串作为sql语句,这个太危险了,要知道前台的值都是可以通过调试工具或者地址栏js注入任意操纵的,或许别人会做一个删除数据库表的sql给你执行呢
[解决办法]
反正不要相信客户端提交的数据就行了,服务器要再验证一遍,其他不用多说

热点排行
Bad Request.