我编程一个网站,你可以发布的东西。 这适用于以下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,以及如何设置计时器? 或任何其他的想法如何确保发布机制?
谢谢!
丹尼斯
你最好的办法是在数据库中存储你的信息。 你可以在一台4个领域:
ipAddress, submitDate, postText, imageUrl
提交后,检查是否有在DB当前IP地址的记录。 如果是这样,比较条目的提交日期与当前的日期,如果是在你的门槛允许提交。 否则,发出错误消息,并且将用户重定向回。
这还不是万无一失的,但是由于IP地址也可以是伪造的,或者用户可以躲在后面的代理。
只是存储的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;
}