PHP计时器,只允许用户输入每两秒(php timer to only allow user inp

2019-09-17 02:17发布

我编程一个网站,你可以发布的东西。 这适用于以下jQuery的AJAX:

    $.ajax({
        type: 'POST',
        url: 'action/post.php',
        data: 'posttext='+posttext+'&imageurl='+imageurl,
        success: function(feedback){
            $('#feedback').val(feedback);
        }
    });

现在我不知道:任何人都可以编写自己的AJAX才能发布到网站,并一遍又一遍地做这个。 如何避免这种情况? 我相信我会需要某种形式的安全检查在post.php中 - 我已经听说了HTTP引用,但可以修改的,所以它不是真正值得信赖。

另外我想补充在post.php中一个计时器,确保来自同一个IP地址后才能公布每x秒一次,并复位定时器如果该信息是x秒发送以下(有点像堆栈溢出做它与评论)。

有谁知道如何保护AJAX,以及如何设置计时器? 或任何其他的想法如何确保发布机制?

谢谢!

丹尼斯

Answer 1:

你最好的办法是在数据库中存储你的信息。 你可以在一台4个领域:

ipAddress, submitDate, postText, imageUrl

提交后,检查是否有在DB当前IP地址的记录。 如果是这样,比较条目的提交日期与当前的日期,如果是在你的门槛允许提交。 否则,发出错误消息,并且将用户重定向回。

这还不是万无一失的,但是由于IP地址也可以是伪造的,或者用户可以躲在后面的代理。



Answer 2:

只是存储的IP,并在日志文件中请求时间。 然后检查该IP的所有脑干每个请求的日志文件,并比较存储的时间。

这里有一个简单的脚本只允许从10秒后,相同的IP请求:

$waitSeconds = 10;
if (allowRequest($waitSeconds)) {
    // allowed
    echo "Welcome.";
} else {
    // not allowed
    echo "Please wait at least $waitSeconds after your last request.";
}
echo '<hr /><a href="#" onclick="location.reload(true);return false">try again</a>';

function getLastRequestTimeDiff($ip = null, $logFile = null)
{
    if ($ip === null) {
        // no specific ip provided, grab vom $_SERVER array
        $ip = $_SERVER["REMOTE_ADDR"];
    }
    if ($logFile === null) {
        // no specific log file taken
        $logFile = "./lookup.log";
    }
    if (!is_file($logFile)) {
        // touch
        file_put_contents($logFile, serialize(array()));
    }
    // read content
    $logContent = file_get_contents($logFile);
    // unserialize, check manual
    $lookup = unserialize($logContent);
    // default diff (f.e. for first request)
    $diff = 0;
    // current timestamp
    $now = time();
    if (array_key_exists($ip, $lookup)) {
        // we know the ip, retrieve the timestamp and calculate the diff
        $diff = $now - $lookup[$ip];
    }
    // set the new request time
    $lookup[$ip] = $now;
    // serialize the content
    $logContent = serialize($lookup);
    // and write it back to our log file
    file_put_contents($logFile, $logContent);
    // return diff (in seconds)
    return $diff;
}

// encapsulate our function in a more simple function (allow yes/no)
function allowRequest($allowed = 10, $ip = null, $logFile = null)
{
    $timeDiff = getLastRequestTimeDiff($ip, $logFile);
    return $timeDiff >= $allowed;
}


文章来源: php timer to only allow user input every two seconds