Java防止非法和重復(fù)表單提交的分析(ZT)
第一,對于不支持POST的,可以簡單的使用如下代碼
if ("POST".equals(request.getMethod())) {
// 正常進(jìn)行
}else{
// 異常請求
out.print("異常訪問");
return;
}
如果是servlet, 可以將doGet方法直接返回,不進(jìn)行處理就行了
public void doGet(HttpServletRequest request, HttpServletResponse response) {
return;
}
public void doPost(HttpServletRequest request, HttpServletResponse response) {
// 正常進(jìn)行操作
}
還可以采用特定的標(biāo)志來區(qū)分,比如
<form><input type="hidden" name="action" value="insert"/></form>
程序里這樣判斷
if ("POST".equals(request.getMethod()) && ("insert".equals(request.getParameter("action")))) {
// 正常進(jìn)行
}else{
// 異常請求
out.print("異常訪問");
return;
}
第二,判斷提交的來源referer,代碼如下
if ("POST".equals(request.getMethod())) {
String referer = request.getHeader("referer");
if (referer == null || !referer.startsWith("http://"+request.getServerName())) {
// 非法來源
return;
}
// 正常進(jìn)行
}else{
// 異常請求
out.print("異常訪問");
return;
}
第三 防止重復(fù)提交的hashCode
在表單顯示頁面
//生成一個(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>();
}
// 檢測重復(fù)問題
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%>" />
在表單提交頁面進(jìn)行如下處理
// 拿到表單的formhash
String formhash = upload.getParameter("formhash");
// 拿到session里面的集合
Set<String> formhashSession = (Set<String>) session.getAttribute("formhashSession");
// 如果沒有,則是重復(fù)提交,或者非法提交
if (formhashSession == null || !formhashSession.contains(formhash)) {
out.println("請不要重復(fù)提交!");
return;
}
// 下面進(jìn)行其它的操作
//
// 最后,如果操作成功,從session里面把這個(gè)formhash 刪掉!
// 以免用戶少填寫了某個(gè)字段,造成表單無法再次提交
formhashSession.remove(formhash);
session.setAttribute("formhashSession", formhashSession);
以上內(nèi)容為本人原創(chuàng)內(nèi)容,如要轉(zhuǎn)載,請保留完整信息。并注明來源為http://blog.csdn.net/或http://www.Java2000.net,







如果是servlet, 可以將doGet方法直接返回,不進(jìn)行處理就行了






還可以采用特定的標(biāo)志來區(qū)分,比如

程序里這樣判斷







第二,判斷提交的來源referer,代碼如下












第三 防止重復(fù)提交的hashCode
在表單顯示頁面















表單里面增加如下字段

在表單提交頁面進(jìn)行如下處理















以上內(nèi)容為本人原創(chuàng)內(nèi)容,如要轉(zhuǎn)載,請保留完整信息。并注明來源為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)人園 閱讀(487) 評論(0) 編輯 收藏 所屬分類: Java