Heim  >  Artikel  >  Backend-Entwicklung  >  Verhindern Sie den direkten Zugriff und verhindern Sie wiederholte Übermittlungen

Verhindern Sie den direkten Zugriff und verhindern Sie wiederholte Übermittlungen

巴扎黑
巴扎黑Original
2016-12-01 09:45:04883Durchsuche

Direkten Zugriff auf die PHP-Seite verhindern
1. Sie können COOKIE zu A hinzufügen und das COOKIE löschen, nachdem B das COOKIE ermittelt hat
2. Verwenden Sie $_SERVER['HTTP_REFERER'], um die vorherige Seite zu verlinken zur aktuellen Seite. Adresse
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-Token verhindert wiederholte Übermittlung

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

Geschäftsbasierte Kontrolle

1) Basierend auf DB-Auszahlung Überprüfung des Bestellstatus

2) Überprüfung mithilfe des einzigartigen Indexmechanismus der Datenbank

3) Cache-basierte Gegenüberprüfung:

Aufgrund des hohen Leistungsverbrauchs von Bei Datenbankoperationen haben wir gelernt, dass Redis-Zähler auch atomare Operationen sind. Setzen Sie Zähler gezielt ein. Es kann nicht nur die Leistung verbessern, sondern auch den Bedarf an Speicher eliminieren und die Spitzen-QPS erhöhen. Nehmen wir als Beispiel die Rückerstattung einer Bestellung:
Jedes Mal, wenn eine Anfrage eingeht, wird ein neuer Zähler mit orderId als Schlüssel erstellt und dann +1. Wenn >1 (Sperre kann nicht erhalten werden): Dies bedeutet, dass gerade ein Vorgang ausgeführt wird. Löschen Sie ihn. Wenn =1 (Sperre erhalten): Kann betrieben werden. Betriebsende (Löschsperre): diesen Zähler löschen.

Das Frontend verhindert wiederholte Übermittlungen und deaktiviert Schaltflächen oder Links

Java-Code

<!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>

Button-Aktivierungscode nach 9 Sekunden

<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 Bei Verwendung der one()-Methode kann jedes Element die Event-Handler-Funktion nur einmal ausführen

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


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn