首頁  >  文章  >  後端開發  >  防直接訪問 防重複提交

防直接訪問 防重複提交

巴扎黑
巴扎黑原創
2016-12-01 09:45:04918瀏覽

防止直接訪問PHP頁
1.可以在A加COOKIE,B判斷COOKIE後用完刪掉COOKIE
2. 使用$_SERVER['HTTP_REFERER'] 得到連結到目前頁面的前一頁的位址
3.token令牌

<?php
/*
* PHP简单利用token防止表单重复提交
* 此处理方法纯粹是为了给初学者参考
*/
session_start();
function set_token()
{
    $_SESSION[&#39;token&#39;] = md5(microtime(true));
}
function valid_token()
{
    $return = $_REQUEST[&#39;token&#39;] === $_SESSION[&#39;token&#39;] ? true : false;
    set_token();
    return $return;
}
//如果token为空则生成一个token
if (!isset($_SESSION[&#39;token&#39;]) || $_SESSION[&#39;token&#39;] == &#39;&#39;) {
    set_token();
}
if (isset($_POST[&#39;test&#39;])) {
    if (!valid_token()) {
        echo "token error";
    } else {
        echo &#39;成功提交,Value:&#39; . $_POST[&#39;test&#39;];
    }
}
?>
<form method="post" action="">
    <input type="hidden" name="token" value="<?php echo $_SESSION[&#39;token&#39;] ?>">
    <input type="text" name="test" value="Default">
    <input type="submit" value="提交"/>
</form>

ajax token防止重複提交

$.ajax({
    type: "POST",
    url: do_order_url,
    data: {
        &#39;_csrf_token&#39;:_csrf_token, //token
        &#39;item_id&#39;:item_id,
    },

基於業務方面的控制

1)基於DB中退款訂單狀態的驗證

2)利用資料庫唯一索引機制的驗證

3)基於快取的計數器驗證:

由於資料庫的操作比較消耗性能,了解到redis的計數器也是原子性操作。果斷採用計數器。既可以提高效能,還不用存儲,而且能提升qps的峰值。還是以訂單退款為例:
每次request進來則新建一個以orderId為key的計數器,然後+1。如果>1(不能取得鎖): 說明有操作在進行,刪除。如果=1(獲得鎖): 可以操作。操作結束(刪除鎖定):刪除這個計數器。

前端防止重複提交,停用按鈕或連結

Java程式碼  

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">  
<html>  
<head>  
<title>测试</title>  
</head>  
<script language="javascript">  
var t = null;  
var flag = true;  
function check(obj) {  
    if (flag) {  
        obj.disabled = flag;  
        flag = false;  
        t = setTimeout(function(){disable(obj)}, 5000); // 5秒间隔  
        window.open("http://www.baidu.com", "newWindow");  
    }  
}  
  
function disable(obj) {  
    obj.disabled = flag;  
    flag = true;  
    if (t != null)  
    clearTimeout(t);  
}  
</script>  
<body>  
<a href="#" onclick="check(this)">ceshi1</a>  
</body>  
</html>

9秒後按鈕啟動程式碼 

<input class="button" type="submit" name="rulesubmit" value="同 意" style="height: 23px">  
<input class="button" type="button" name="return" value="不同意" style="height: 23px" onclick="javascript:history.go(-1);">  
</center>  
</form>  
  
<script type="text/javascript">  
var secs = 9;  
var wait = secs * 1000;  
document.bbrules.rulesubmit.value = "同 意(" + secs + ")";  
document.bbrules.rulesubmit.disabled = true;  
for(i = 1; i <= secs; i++) {  
        window.setTimeout("update(" + i + ")", i * 1000);  
}  
window.setTimeout("timer()", wait);  
function update(num, value) {  
        if(num == (wait/1000)) {  
                document.bbrules.rulesubmit.value = "同 意";  
        } else {  
                printnr = (wait / 1000) - num;  
                document.bbrules.rulesubmit.value = "同 意(" + printnr + ")";  
        }  
}  
function timer() {  
        document.bbrules.rulesubmit.disabled = false;  
        document.bbrules.rulesubmit.value = "同 意";  
}  
</script>

Jquery one當使用one() 

$("p").one("click",function(){    
});

Jquery one當使用一次) 方法

  

rrreee🎜🎜🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn