JavaWeb學(xué)習(xí)(1) 使用Session和Token防止表單重復(fù)提交

前言

以前在很多p2p網(wǎng)站中削祈,都有新手領(lǐng)取紅包的活動烛卧。這樣的紅包鏈接或多或少都有很多的漏洞九串,就是表單可以重復(fù)提交生棍。這樣的話,對那些p2p網(wǎng)站或者其他類似的網(wǎng)站造成很大的損失蛤虐。Fiddler大家都不陌生吧党饮,就是一個(gè)抓包軟件。我們先攔截url請求驳庭,Shift+R刑顺,填入壓力測試的次數(shù),然后釋放饲常,就會造成很多次的url訪問請求蹲堂,這樣的結(jié)果很容易造成表單重復(fù)提交。那么我們的今天主題就是如何使用Session和Token防止表單重復(fù)提交


表單重復(fù)提交例子

在我們寫網(wǎng)站的時(shí)候贝淤,肯定寫過留言板的功能柒竞,但是肯定對重復(fù)提交留言的惡性行為沒有進(jìn)行一些安全措施。


Paste_Image.png

我們利用Fiddler這一款抓包軟件播聪,可以進(jìn)行壓力測試朽基,模擬多次url請求。就會造成以下情況离陶,留言板被惡性刷屏稼虎。

Paste_Image.png

如何進(jìn)行防止表單重復(fù)提交

其實(shí)很簡單的,我們只需要生成一個(gè)唯一的token,分別放進(jìn)客戶端的表單里和服務(wù)器的session中進(jìn)行了枕磁。當(dāng)我們發(fā)起請求時(shí)渡蜻,只需要判斷session中的token(以下簡稱serverToken)和客戶端表單里的token(以下簡稱clientToken)是否相等术吝。 如果severToken==null,clientToken==null 還有
serverToken不等于clientToken计济,那么就說明表單被重復(fù)提交了。反之排苍,如果serverToken==clientToken沦寂,就說明表單沒有被重復(fù)提交,當(dāng)我們進(jìn)行了一系列需要的操作后淘衙,就可以清除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="請不要重復(fù)提交";
    request.getSession().setAttribute("result",result);
    return "/result.jsp";
    }
    request.getSession().removeAttribute(clientToken);
    }
    </pre>

<pre>
/**
*
* @param serverToken
* @param clientToken
* @return
* 如果沒有重復(fù)提交 返回true, 如果重復(fù)提交 返回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>


效果圖

我自己寫了一個(gè)圖片上傳的demo,就來測試一下是否能防止重復(fù)提交吧

Paste_Image.png

首先手動測試一下彤守,是否能防止重復(fù)提交

Paste_Image.png

我們上傳成功后毯侦,再次刷新地址欄,會發(fā)現(xiàn)已經(jīng)防止了表單重復(fù)提交

Paste_Image.png

手動測試完畢了具垫,心里肯定是美滋滋了侈离。那么我們用Fiddler來測試一下吧,我們來模擬一下壓力測試筝蚕。

Paste_Image.png

我們從Fiddler看到返回結(jié)果卦碾,心里更是美滋滋了铺坞。已經(jīng)成功防止了表單重復(fù)提交不安全的行為了。

Paste_Image.png
發(fā)現(xiàn)的問題

寫這邊簡文的時(shí)候洲胖,我也看到其他大牛寫的博客济榨。在底下的評論也發(fā)現(xiàn)了一個(gè)存在的問題。就是打開2個(gè)上傳圖片的網(wǎng)頁绿映,在第一個(gè)網(wǎng)頁上傳到了照片擒滑,提示"上傳成功"。然后在打開第二個(gè)網(wǎng)頁再上傳圖片绘梦,就會提示"請不要重復(fù)提交"橘忱。這是什么問題造成的呢?其實(shí)仔細(xì)想一下就會發(fā)現(xiàn)卸奉, 當(dāng)?shù)谝粋€(gè)網(wǎng)站上傳圖片成功后钝诚,就會清除Session中的token值,此時(shí)的serverToken=null了榄棵。就會造成第二個(gè)網(wǎng)站上傳圖片時(shí)候凝颇,serverToken=null和serverToken!=clientToken,那么肯定會提示"請不要重復(fù)提交"疹鳄。


解決方案

看到這里拧略,你們估計(jì)還有疑問?那么就想一下為什么我要生成唯一的Token瘪弓。我們這個(gè)Token是每一次用戶請求的標(biāo)識垫蛆。我們只需要serverToken在Session中的屬性值設(shè)置為唯一的Token即可。就不會發(fā)生剛才的情況腺怯。

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


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末袱饭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子呛占,更是在濱河造成了極大的恐慌虑乖,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晾虑,死亡現(xiàn)場離奇詭異疹味,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)帜篇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門糙捺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人笙隙,你說我怎么就攤上這事洪灯。” “怎么了逃沿?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵婴渡,是天一觀的道長幻锁。 經(jīng)常有香客問我,道長边臼,這世上最難降的妖魔是什么哄尔? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮柠并,結(jié)果婚禮上岭接,老公的妹妹穿的比我還像新娘。我一直安慰自己臼予,他們只是感情好鸣戴,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著粘拾,像睡著了一般窄锅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缰雇,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天入偷,我揣著相機(jī)與錄音,去河邊找鬼械哟。 笑死疏之,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的暇咆。 我是一名探鬼主播锋爪,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼爸业!你這毒婦竟也來了其骄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤沃呢,失蹤者是張志新(化名)和其女友劉穎年栓,沒想到半個(gè)月后拆挥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體薄霜,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年纸兔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惰瓜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡汉矿,死狀恐怖崎坊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洲拇,我是刑警寧澤奈揍,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布曲尸,位于F島的核電站,受9級特大地震影響男翰,放射性物質(zhì)發(fā)生泄漏另患。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一蛾绎、第九天 我趴在偏房一處隱蔽的房頂上張望昆箕。 院中可真熱鬧,春花似錦租冠、人聲如沸鹏倘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纤泵。三九已至,卻和暖如春镜粤,著一層夾襖步出監(jiān)牢的瞬間夕吻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工繁仁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涉馅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓黄虱,卻偏偏與公主長得像稚矿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子捻浦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理晤揣,服務(wù)發(fā)現(xiàn),斷路器朱灿,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • 在平時(shí)開發(fā)中昧识,如果網(wǎng)速比較慢的情況下,用戶提交表單后盗扒,發(fā)現(xiàn)服務(wù)器半天都沒有響應(yīng)跪楞,那么用戶可能會以為是自己沒有提交表...
    重山楊閱讀 1,745評論 5 26
  • 概述 Struts就是基于mvc模式的框架!(struts其實(shí)也是servlet封裝侣灶,提高開發(fā)效率甸祭!) Strut...
    奮斗的老王閱讀 2,924評論 0 51
  • 前言:我國目前約有73%的孕婦懷孕期間體重增長超過世界衛(wèi)生組織的標(biāo)準(zhǔn)池户,專家提醒您,女性在孕期體重增長25斤左右較為...
    金灶沐_馬維閱讀 568評論 0 0
  • 百度詞條給“探索”一個(gè)這樣的解釋:指研究未知事物的精神,或指對事物進(jìn)行搜查的行為校焦,或指多方尋求答案的過程赊抖。 自從在...
    小鹿莊園zhlu閱讀 363評論 1 0