发新话题
移动帖子 加入精华 加入置顶 加入收藏 关注此帖

Java进行程序的Post表单提交检查,防止非法和重复提交的分析



Java进行程序的Post表单提交检查,防止非法和重复提交的分析

第一,对于不支持POST的,可以简单的使用如下代码
if ("POST".equals(request.getMethod())) {
  // 正常进行
}else{
  // 异常请求
  out.print("异常访问");
  return;
}
如果是servlet, 可以将doGet方法直接返回,不进行处理就行了
public void doGet(HttpServletRequest request, HttpServletResponse response) {
  return;
}
public void doPost(HttpServletRequest request, HttpServletResponse response) {
  // 正常进行操作
}
还可以采用特定的标志来区分,比如
<form><input type="hidden" name="action" value="insert"/></form>
程序里这样判断
if ("POST".equals(request.getMethod()) && ("insert".equals(request.getParameter("action")))) {
  // 正常进行
}else{
  // 异常请求
  out.print("异常访问");
  return;
}
第二,判断提交的来源referer,代码如下
if ("POST".equals(request.getMethod())) {
  String referer = request.getHeader("referer");
  if (referer == null || !referer.startsWith("http://"+request.getServerName())) {
    // 非法来源
    return;
  }
  // 正常进行
}else{
  // 异常请求
  out.print("异常访问");
  return;
}
第三 防止重复提交的hashCode
在表单显示页面
  //生成一个formhash,算法可以自己定,不随便重复就可以了
  String formhash = MD5.encode(Long.toString(new Date().getTime()));
  //读取当前session里面的hashCode集合,此处使用了Set,方便判断。
  Set<String> formhashSession = (Set<String>) session.getAttribute("formhashSession");
  if (formhashSession == null) {
    formhashSession = new HashSet<String>();
  }
  // 检测重复问题
  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%>" /> 
在表单提交页面进行如下处理
    // 拿到表单的formhash
    String formhash = upload.getParameter("formhash");
    // 拿到session里面的集合
    Set<String> formhashSession = (Set<String>) session.getAttribute("formhashSession");
    // 如果没有,则是重复提交,或者非法提交
    if (formhashSession == null || !formhashSession.contains(formhash)) {
      out.println("请不要重复提交!");
      return;
    }
    // 下面进行其它的操作
    // 
    // 最后,如果操作成功,从session里面把这个formhash 删掉!
    // 以免用户少填写了某个字段,造成表单无法再次提交
    formhashSession.remove(formhash);
    session.setAttribute("formhashSession", formhashSession);
快乐渡过每一天,减肥坚持每一天
编辑 回复 快速回复 TOP

Re:Java进行程序的Post表单提交检查,防止非法和重复提交的分析

好东西
编辑 回复 快速回复 TOP
发新话题