function getUrlParameter(name) {
    /// <summary>获得URL的指字参数</summary>
    /// <param name="name" type="String">参数名</param>
    var url = location.href;
    var index = url.indexOf("?");
    var result = "null";
    if (index > 0) {
        var items = url.substring(index + 1).match(new RegExp("[^&]+", "g"));
        for (var j = 0; j < items.length; j++) {
            if (new RegExp(name + "=", "g").test(items[j])) {
                result = items[j].replace(new RegExp(name + "=", "g"), "");
            }
        }
    }
    return result;
}
function getCookies(name, sub_name) {
    /// <summary>获得cookie集合值[健值对]</summary>
    /// <param name="name" type="String">cookie名称</param>
    /// <param name="sub_name" type="String">找到cookie集合值中sub_name健的值</param>
    var result;
    var reg = /[^;]+/ig;
    var itmes = document.cookie.match(new RegExp("[^;]+", "ig"));
    for (var i = 0; i < itmes.length; i++) {
        var cookie_name = itmes[i].substring(0, itmes[i].indexOf("="));
        cookie_name = cookie_name.replace(/ /g, "");
        if (cookie_name == name) {
            var subItmes = itmes[i].substring(itmes[i].indexOf("=") + 1).match(new RegExp("[^&]+", "g"));
            for (var j = 0; j < subItmes.length; j++) {
                if (new RegExp(sub_name + "=", "g").test(subItmes[j])) {
                    result = subItmes[j].replace(new RegExp(sub_name + "=", "g"), "");
                }
            }
        }
    }
    return result;
}
function createValidateString(data) {
    /// <summary>制作中文验证码</summary>
    /// <param name="data" type="json">{id,name}id要显示的元素标签,name验证码存放在cookie里的名称</param>
    var strings = ['五福临门', '福如东海', '步步高升', '岁岁平安', '辞旧迎新', '心想事成', '事事顺心', '年年平安', '十全十美', '事业有成', '蒸蒸日上', '四季发财', '扬帆远航', '一生平安', '身体健康', '马到成功', '九九九', '恭喜发财', '财源滚滚', '招财进宝', '财源广进'];
    var index = parseInt(Math.random() * 20);
    document.getElementById(data.id).innerHTML = strings[index];
    setCookie(data.name, strings[index]);
}
function checkBoxSelect() {
    /// <summary>CheckBox实现全选操作</summary>
    var items = document.getElementsByTagName("input");    if (items.length > 0) {
        for (var i = 0; i < items.length; i++) {
            if (items[i].type == "checkbox") {
                if (items[i].checked == true) {
                    items[i].checked = false;
                } else {
                    items[i].checked = true;
                }
            }
        }
    }
}
function btnUrl(name, url) {
    /// <summary>按钮跳转到指定的路径</summary>
    /// <param name="name" type="String">参数名</param>
    /// <param name="url" type="String">指定的路径</param>
    var val = getUrlParameter(name);    location = url + "?" + name + "=" + val;
}

解决方案 »

  1.   

    纯属路过,呵呵忍不住提几点:1 如果把这贴子发到 Javascript 版块应该会有更多人路过的
    2 获取参数(QueryString)的方法如果叫 queryString 是不是更爽?此外,试试使用 split 来处理
    3 客户端的验证码不可靠的,只能防住乖乖而可怜的用户,而验证码的作用在于防护恶意的自动程序的处理;由此可见,这客户端的验证码不但没起到作用,反而还妨碍了使用
    4 checkBoxSelect 循环里的判断有点多余
    5 btnUrl 方法容易导致参数丢失(如果以前有5个参数,跳转后只剩一个了)
      

  2.   

    对于js验证码,我想补充下
    验证码的值是存诸是cookie里的,如果客户端禁止了cookie也不打紧
    后台有
    if(Request.Cookies["vali"]!=null))
    {
     //登录代码
    }else
    {
    Response.Write("<script>alert('验证码异常无法登录,请将本浏览器设置成默认设置后再进行登录操作。谢谢!')</script>");
    }
      

  3.   

    你的后台代码是这样判断cookie的
    if(Request.Cookies["vali"]!=null))
    {
      //登录代码
    }else
    {
    Response.Write("<script>alert('验证码异常无法登录,请将本浏览器设置成默认设置后再进行登录操作。谢谢!')</script>");
    }也就是说你只判断这个cookie是否存在,只要不为空即可,而不管cookie的值是什么那么我完全可以用c语言写一个自动post机器,在http请求头里面加上 名称为vali的 cookie,随便给它赋值就能绕过验证了
      

  4.   


        var url = location.href;
        var index = url.indexOf("?");
        var result = "null";
        if (index > 0) {
            var items = url.substring(index + 1).match(new RegExp("[^&]+", "g"));
            for...用location.search更简洁些    var result = "null";
            var items = location.search.match(new RegExp("[^&]+", "g"));
            for...
      

  5.   

    你的 JS 验证码如何绕过去?
    你就说你打算怎么用它吧?你怎么用我就怎么绕!要知道对于自动程序来说,可以随意执行你页面时的任意脚本,并可以随意修改脚本里的任何值;
    更让你无法接受的是,对于自动程序我来说,我根本无视你这个客户端验证码的存在,直接给你接收页面 post 数据,你服务器就根本没地儿躲了。
      

  6.   

    就是直接拿你的URL,POST数据,所以客户神马验证啊神马的,都是不安全。即使是有效性检测,也还是需要后台再验证一次的。
      

  7.   

    我写段源代码代出来看看,你们检测检测看。
    if(Request.Cookies["vali"]!=null)
    {
     if(this.txtVali.Value!=Request.Cookies["vali"])
    {
       //提示错误
       return;
    }
    //别的验证
    }
      

  8.   

    怎么个post法,贴段代码出来咯。我不知道直接拿URL,POST数据这种实现方法。请教。
      

  9.   

    验证码一般是我一般是放在session中
      

  10.   


    Cookie 也可以在请求中随意伪造的,哈哈
      

  11.   

    这个指的是那个取URL参数的函数命名吧。相信很多人和我一样会对2楼这个说法不认同。楼主原来命名得很合适。如果这样改了,意义就扩散了,很模糊,不明确了。其他的2楼说得都不错。尤其验证码方面,可以去掉,不是这么简单做的。另外关于checkBoxSelect() ,因为2楼说循环里的代码有点重复,就看了一下,发现其实代码的实际作用并非全选,而是反向选择。但我认为更大的问题是,这段代码没有通过任何方式限定要处理的对象的范围,比如如果页面内存在多组控件,现在只想操作其中一组或几组,如果用这个代码,就是对全部的CHECKBOX进行处理了。所以这个函数目前还不具备通用性,只能说是针对某一种特殊的页面构成情况而可以使用的方法,一旦页面结构发生变化,也可能就误操作了。如果楼主真想从总体和长远角度来集合一些封装好的函数,那么还不如利用JQ这样的现成的优秀框架。熟悉它以后,就象它所标榜的“用少数几句话,嘀咕嘀咕,事就办完了”。你现在的很多代码,用它一句就完了,封装不封装就没多大意义了。
      

  12.   

    jquery我也有用的,总感觉用他的心虚,就一种不信任感。
      

  13.   

    我觉得有时候还是要自个写写自已需求的封装方法的,我也用jQuery,但jQuery只给个函数名和参数给你调用,然后你按他们的设定去配置,如果开发中可以怎么快怎么用,但闲时是不是还是要有些自创精神,那怕我们有时去翻下jQuery之类的源代码也是好的。说的天真点,如果中国的程序员每个人都有这些自创精神,不一味的去偏向拿来主义或许我们的IT产业也会进步的快些。当然只代表个人看法。
      

  14.   


    之所以建议使用 queryString 是因为可以与 ASP.NET 的 Request.QueryString 属性对应,对于 ASP.NET 开发者来说,这没什么额外的歧义;
    checkBoxSelect 中的判断确实多余,可作如下更改则更简洁,你说呢:items[i].checked = !(items[i].checked); 
    此外,楼主确实可以在 checkBoxSelect 中添加一个参数,表示根元素,表示从该元素处开始取 checkbox,以免影响整个页面中的所有 checkbox自己尝试封装库是有益的。至少可以加深对正在封装功能的理解,能强化复用代码的意识,为复用和分享代码提供来源。可以说,要成为所谓的大牛,封装代码是必由之路。
    对于楼主在 33楼、34楼的回复:对 jQuery 的怀疑精神是可贵的,我偶尔还对 ASP.NET 怀疑呢——事实上,就拿 ASP.NET 来说,其本身的控件就广受诟病,由此可见已有框架并不就是优秀的。
    但我想说,jQuery 是个例外:
    1 jQuery 是个完全开源开放的客户端库,其优秀的模式与代码经得起全世界程序员的考验,不敢说它做到了完美,但一般人想去优化它已有的代码还是比较难的;
    2 jQuery 包含的功能确有众多,此时可以选择较低版本的 jQuery 来小化库大小,并满足你的使用需求;甚至可以拿开发版的源代码自己去掉一些用不到的功能,再压缩打包。
    对库底层的怀疑精神促使我们更有兴趣去探索底层的实现原理,使你去学习它,从而更好地掌握它。当你读完读懂并被这底层的原理折服之后,对这项技术的掌握程度就又高了一个层次;并且由于打消了此前的疑虑,你会更加有信心、放心地使用库
    所以研究库的底层和核心是大有裨益的