>  기사  >  백엔드 개발  >  직접 접근 방지 및 반복 제출 방지

직접 접근 방지 및 반복 제출 방지

巴扎黑
巴扎黑원래의
2016-12-01 09:45:04917검색

PHP 페이지에 대한 직접 접근 방지
1. A에 COOKIE를 추가하고 B가 COOKIE를 확인한 후 COOKIE를 삭제할 수 있습니다
2. 이전 페이지를 연결하려면 $_SERVER['HTTP_REFERER']를 사용하세요. 현재 페이지 주소
3.token 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 토큰으로 중복 제출 방지

$.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를 늘릴 수 있습니다. 주문 환불을 예로 들어보겠습니다.
요청이 들어올 때마다 orderId를 키로 하는 새 카운터가 생성되고 +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(){    
});


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.