【问题标题】:PHP Server-side rate limit on AJAX callbacks?AJAX回调的PHP服务器端速率限制?
【发布时间】:2017-09-10 05:40:08
【问题描述】:

我将 PHP 与 AJAX 一起用于我网站上的许多功能。我已经使用 Javascript 在客户端实现了一种速率限制系统。基本上,在单击按钮后将其禁用 1 秒。

虽然这对于更无辜的情况来说效果很好,但我觉得我也需要在服务器端做一些事情来限制请求。

基本上,我希望用户每秒可以进行最大数量的 AJAX 调用。事实上,每秒一个似乎是合理的。

一种方法是以某种方式将每个请求记录到我的 AJAX 回调中,并在发出新请求之前从该表中读取。但这会极大地增加我的服务器和数据库的工作量。

有没有其他方法可以做到这一点?

PHP

function comment_upvote_callback() {    

    // Some sort of rate limit??


    // $_POST data validation

    // Add upvote to database

    // Return success or error

} 
add_action( 'wp_ajax_comment_upvote_callback', 'comment_upvote_callback' );

jQuery

​​>
var is_clicked = false;

if ( is_clicked == false ) {
    $('#comments').on('click', '.comment-upvote', function(event) {
        event.preventDefault();

        // Button disabled as long as isClicked == true
        isClicked = true;

        // Data to be sent
        var data = {
            'action': 'comment_upvote_callback',
            'security': nonce,  
            'comment_id': comment_id
        };

        // Send Data
        jQuery.post(ajaxurl, data, function(response) {

            // Callback

            // Client-side rate limit
            setTimeout( function() {
                is_clicked = false;
            }, 1000);
        });
    });
}

【问题讨论】:

标签: php ajax wordpress rate-limiting


【解决方案1】:

如上所述,您应该在服务器端使用速率限制 我已经编写了一个代码来实现相同的。您可以将代码复制到文件中,然后简单地包含在顶部的服务器端脚本中。它最多接受 3 次点击/5 秒。您可以根据需要更改费率

    session_start();
    const cap = 3;
    $stamp_init = date("Y-m-d H:i:s");
    if( !isset( $_SESSION['FIRST_REQUEST_TIME'] ) ){
            $_SESSION['FIRST_REQUEST_TIME'] = $stamp_init;
    }
    $first_request_time = $_SESSION['FIRST_REQUEST_TIME'];
    $stamp_expire = date( "Y-m-d H:i:s", strtotime( $first_request_time )+( 5 ) );
    if( !isset( $_SESSION['REQ_COUNT'] ) ){
            $_SESSION['REQ_COUNT'] = 0;
    }
    $req_count = $_SESSION['REQ_COUNT'];
    $req_count++;
    if( $stamp_init > $stamp_expire ){//Expired
            $req_count = 1;
            $first_request_time = $stamp_init;
    }
    $_SESSION['REQ_COUNT'] = $req_count;
    $_SESSION['FIRST_REQUEST_TIME'] = $first_request_time;
    header('X-RateLimit-Limit: '.cap);
    header('X-RateLimit-Remaining: ' . ( cap-$req_count ) );
    if( $req_count > cap){//Too many requests
            http_response_code( 429 );
            exit();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-25
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多