風(fēng)人園

          弱水三千,只取一瓢,便能解渴;佛法無(wú)邊,奉行一法,便能得益。
          隨筆 - 99, 文章 - 181, 評(píng)論 - 56, 引用 - 0
          數(shù)據(jù)加載中……

          Java防止非法和重復(fù)表單提交的分析(ZT)

          第一,對(duì)于不支持POST的,可以簡(jiǎn)單的使用如下代碼
          if ("POST".equals(request.getMethod())) {
            
          // 正常進(jìn)行
          }
          else{
            
          // 異常請(qǐng)求
            out.print("異常訪問(wèn)");
            
          return;
          }

          如果是servlet, 可以將doGet方法直接返回,不進(jìn)行處理就行了
          public void doGet(HttpServletRequest request, HttpServletResponse response) {
            
          return;
          }

          public void doPost(HttpServletRequest request, HttpServletResponse response) {
            
          // 正常進(jìn)行操作
          }

          還可以采用特定的標(biāo)志來(lái)區(qū)分,比如
          <form><input type="hidden" name="action" value="insert"/></form> 

          程序里這樣判斷
          if ("POST".equals(request.getMethod()) && ("insert".equals(request.getParameter("action")))) {
            
          // 正常進(jìn)行
          }
          else{
            
          // 異常請(qǐng)求
            out.print("異常訪問(wèn)");
            
          return;
          }

          第二,判斷提交的來(lái)源referer,代碼如下
          if ("POST".equals(request.getMethod())) {
            String referer 
          = request.getHeader("referer");
            
          if (referer == null || !referer.startsWith("http://"+request.getServerName())) {
              
          // 非法來(lái)源
              return;
            }

            
          // 正常進(jìn)行
          }
          else{
            
          // 異常請(qǐng)求
            out.print("異常訪問(wèn)");
            
          return;
          }

          第三 防止重復(fù)提交的hashCode
          在表單顯示頁(yè)面
            //生成一個(gè)formhash,算法可以自己定,不隨便重復(fù)就可以了
            String formhash = MD5.encode(Long.toString(new Date().getTime()));
            
          //讀取當(dāng)前session里面的hashCode集合,此處使用了Set,方便判斷。
            Set<String> formhashSession = (Set<String>) session.getAttribute("formhashSession");
            
          if (formhashSession == null{
              formhashSession 
          = new HashSet<String>();
            }

            
          // 檢測(cè)重復(fù)問(wèn)題
            while (formhashSession.contains(formhash)) {
              formhash 
          = MD5.encode(Long.toString(new Date().getTime()));
            }

            
          // 保存到session里面
            formhashSession.add(formhash);
            
          // 保存
            session.setAttribute("formhashSession", formhashSession);

          表單里面增加如下字段
          <input type="hidden" name="formhash" id="formhash" value="<%=formhash%>" /> 

          在表單提交頁(yè)面進(jìn)行如下處理
              // 拿到表單的formhash
              String formhash = upload.getParameter("formhash");
              
          // 拿到session里面的集合
              Set<String> formhashSession = (Set<String>) session.getAttribute("formhashSession");
              
          // 如果沒(méi)有,則是重復(fù)提交,或者非法提交
              if (formhashSession == null || !formhashSession.contains(formhash)) {
                out.println(
          "請(qǐng)不要重復(fù)提交!");
                
          return;
              }

              
          // 下面進(jìn)行其它的操作
              
          // 
              
          // 最后,如果操作成功,從session里面把這個(gè)formhash 刪掉!
              
          // 以免用戶少填寫(xiě)了某個(gè)字段,造成表單無(wú)法再次提交
              formhashSession.remove(formhash);
              session.setAttribute(
          "formhashSession", formhashSession);

          以上內(nèi)容為本人原創(chuàng)內(nèi)容,如要轉(zhuǎn)載,請(qǐng)保留完整信息。并注明來(lái)源為http://blog.csdn.net/或http://www.Java2000.net,

          Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=2119298

          posted on 2008-02-29 16:42 風(fēng)人園 閱讀(492) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Java

          主站蜘蛛池模板: 和政县| 大厂| 贵南县| 南汇区| 博乐市| 滁州市| 峡江县| 德保县| 祥云县| 蒲城县| 北京市| 邯郸县| 潞城市| 民和| 祥云县| 咸阳市| 得荣县| 宣恩县| 平顶山市| 德庆县| 阿拉善右旗| 合肥市| 高台县| 兴山县| 黔西| 五华县| 岳普湖县| 阳新县| 八宿县| 乌拉特中旗| 天全县| 体育| 五寨县| 新密市| 大冶市| 陆河县| 贡山| 新巴尔虎左旗| 麻城市| 自贡市| 綦江县|