ホームページ >バックエンド開発 >PHPチュートリアル >直接アクセスを防止し、繰り返し送信を防止する

直接アクセスを防止し、繰り返し送信を防止する

巴扎黑
巴扎黑オリジナル
2016-12-01 09:45:04940ブラウズ

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トークンにより重複送信を防止

$.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() メソッドを使用する場合、各要素はイベント ハンドラー関数のみを実行できます一度

りー


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。