美文网首页WeLi的java学习Java学习笔记程序员
JavaWeb学习(1) 使用Session和Token防止表单

JavaWeb学习(1) 使用Session和Token防止表单

作者: cmazxiaoma | 来源:发表于2017-05-31 21:00 被阅读287次
前言

以前在很多p2p网站中,都有新手领取红包的活动。这样的红包链接或多或少都有很多的漏洞,就是表单可以重复提交。这样的话,对那些p2p网站或者其他类似的网站造成很大的损失。Fiddler大家都不陌生吧,就是一个抓包软件。我们先拦截url请求,Shift+R,填入压力测试的次数,然后释放,就会造成很多次的url访问请求,这样的结果很容易造成表单重复提交。那么我们的今天主题就是如何使用Session和Token防止表单重复提交


表单重复提交例子

在我们写网站的时候,肯定写过留言板的功能,但是肯定对重复提交留言的恶性行为没有进行一些安全措施。


Paste_Image.png

我们利用Fiddler这一款抓包软件,可以进行压力测试,模拟多次url请求。就会造成以下情况,留言板被恶性刷屏。

Paste_Image.png
如何进行防止表单重复提交

其实很简单的,我们只需要生成一个唯一的token,分别放进客户端的表单里和服务器的session中进行了。当我们发起请求时,只需要判断session中的token(以下简称serverToken)和客户端表单里的token(以下简称clientToken)是否相等。 如果severToken==null,clientToken==null 还有
serverToken不等于clientToken,那么就说明表单被重复提交了。反之,如果serverToken==clientToken,就说明表单没有被重复提交,当我们进行了一系列需要的操作后,就可以清除session中的token了。


具体代码
  • 生成唯一的Token
    public static String makeToken(){
    String token=(System.currentTimeMillis()+new Random().nextInt(999999999))+"";
    try {
    MessageDigest mDigest=MessageDigest.getInstance("md5");
    byte[] md5=mDigest.digest(token.getBytes());
    BASE64Encoder encoder=new BASE64Encoder();
    return encoder.encode(md5);
    } catch (NoSuchAlgorithmException e) {
    throw new RuntimeException(e);
    }}
  • Jsp代码
    <pre>
    <%
    String token=CommonUtils.makeToken();
    request.getSession().setAttribute(token,token);
    %>
    <form enctype="multipart/form-data" action="${pageContext.request.contextPath}/PhotoServlet?method=uploadPhoto&token=<%=token%>" method="post">
    上传图片:<input type="file" name="file"/>

    描 述:<input type="text" name="desc"/>

    <input type="submit" value="提交"/>

    </form>
    </pre>
  • Serlvet代码
    <pre>
    public String uploadPhoto(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    String result=null;
    String clientToken=request.getParameter("token");
    String serverToken=(String)request.getSession().getAttribute(clientToken);
    if(!isRepeatCommit(serverToken, clientToken)){
    result="请不要重复提交";
    request.getSession().setAttribute("result",result);
    return "/result.jsp";
    }
    request.getSession().removeAttribute(clientToken);
    }
    </pre>

<pre>
/**
*
* @param serverToken
* @param clientToken
* @return
* 如果没有重复提交 返回true, 如果重复提交 返回fasle
*/
public boolean isRepeatCommit(String serverToken,String clientToken){
MyLog.i(TAG, "serverToken="+serverToken+",clientToken="+clientToken);
if(serverToken==null){
return false;
}

    if(clientToken==null){
        return false;
    }
    
    if(!clientToken.equals(serverToken)){
        return false;
    }
    
    return true;
}

</pre>


效果图

我自己写了一个图片上传的demo,就来测试一下是否能防止重复提交吧

Paste_Image.png

首先手动测试一下,是否能防止重复提交

Paste_Image.png

我们上传成功后,再次刷新地址栏,会发现已经防止了表单重复提交

Paste_Image.png

手动测试完毕了,心里肯定是美滋滋了。那么我们用Fiddler来测试一下吧,我们来模拟一下压力测试。

Paste_Image.png

我们从Fiddler看到返回结果,心里更是美滋滋了。已经成功防止了表单重复提交不安全的行为了。

Paste_Image.png
发现的问题

写这边简文的时候,我也看到其他大牛写的博客。在底下的评论也发现了一个存在的问题。就是打开2个上传图片的网页,在第一个网页上传到了照片,提示"上传成功"。然后在打开第二个网页再上传图片,就会提示"请不要重复提交"。这是什么问题造成的呢?其实仔细想一下就会发现, 当第一个网站上传图片成功后,就会清除Session中的token值,此时的serverToken=null了。就会造成第二个网站上传图片时候,serverToken=null和serverToken!=clientToken,那么肯定会提示"请不要重复提交"。


解决方案

看到这里,你们估计还有疑问?那么就想一下为什么我要生成唯一的Token。我们这个Token是每一次用户请求的标识。我们只需要serverToken在Session中的属性值设置为唯一的Token即可。就不会发生刚才的情况。

<pre>
String token=CommonUtils.makeToken();
request.getSession().setAttribute(token,token);
%>
</pre>


相关文章

  • JavaWeb学习(1) 使用Session和Token防止表单

    前言 以前在很多p2p网站中,都有新手领取红包的活动。这样的红包链接或多或少都有很多的漏洞,就是表单可以重复提交。...

  • 002_JavaWeb避免重复提交

    JavaWeb避免重复提交 现象 利用Session防止表单重复提交 问题: 测试代码 更多信息:www.itco...

  • token,cookie,session

    Android客户端和服务端如何使用Token和Session Token ,Cookie和Session的区别-...

  • Token,Session,cookie

    Token 参考Android客户端和服务端如何使用Token和Session 1.Token的存在? 如果一个A...

  • 使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表...

  • springboot 结合Token的使用

    Token和session的都是用于身份的验证,而session需要存储空间,Token并不需要,这次使用的主要是...

  • 说说session与cookie

    知识点:session,cookie,sessionID,url重启和表单隐藏字段来防止人为不传cookie 当你...

  • Token登录认证

    参考文章: Token 认证的来龙去脉 前后端分离使用 Token 登录解决方案 理解Cookie和Session...

  • 从session、cookie到token以及JWT

    从session、cookie到token以及JWT 主要讲token和jwt技术,关于session和cooki...

  • Android token使用

    Android token使用 对于初学者来说,对Token和Session的使用难免会限于困境,开发过程中知道有...

网友评论

  • mjlwt:值得参考
  • 9d86cb80bad3:为什么两个token都是通过request 获取的?
    9d86cb80bad3:@cmazxiaoma 你是安卓开发?
    cmazxiaoma:@呆萌的小狮子 一个是保存在表单里面,一个是放在服务器的session中

本文标题:JavaWeb学习(1) 使用Session和Token防止表单

本文链接:https://www.haomeiwen.com/subject/ksijfxtx.html