2012-05-08 87 views
5

我正在編寫一個網站,您可以發佈內容。這適用於以下jQuery的AJAX:php定時器只允許用戶每兩秒輸入一次

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

現在我不知道:任何人都可以編寫自己的AJAX才能發佈到網站,並一遍又一遍地做這個。我如何防止這種情況?我確信我需要在post.php中進行某種安全檢查 - 我已經聽說過http referer,但是可以修改它,所以它不是真正值得信賴的。

此外,我想在post.php中添加一個計時器,以確保來自同一個IP地址的帖子只能每x秒發佈一次,並在帖子發送到x秒以下時重置計時器(種類像堆棧溢出這樣做與評論)。

有誰知道如何保護ajax以及如何設置計時器?或者其他任何想法如何確保發佈機制?

謝謝!

Dennis

+0

唯一方法是創建用戶唯一的標識符,並檢查這在服務器端。依靠數據庫中的數據,就好像您在PHP中的代碼是好的一樣,不會有任何混亂。 ajax中的所有內容僅適用於UX –

+0

您可否詳細闡述一下? UX? – weltschmerz

+0

UX =用戶體驗 –

回答

1

您最好的方法是將您的信息存儲在數據庫中。您可以在一個表中有4個字段:

ipAddress, submitDate, postText, imageUrl 

提交後,檢查數據庫中是否有當前IP地址的條目。如果是,請將條目的提交日期與當前日期進行比較,如果超過了閾值,則允許提交。否則,請發出錯誤消息並將用戶重定向回來。

然而,這仍然不是萬無一失的,因爲IP地址也可能被欺騙,或者用戶可能隱藏在代理之後。

+1

另請注意,如果您的用戶全部來自大學宿舍,並且在一個IP地址後面NAT,則會阻止兩個人同時發帖。 –

+0

我可以使用ip和用戶代理的組合 - 會工作嗎? – weltschmerz

+0

@DMoses好點。 OP專門聲明瞭IP地址,但要解決這個問題,您可以要求輸入電子郵件地址,也可以進行完整的用戶登錄。大釘子的大錘子。 –

1

只是將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; 
} 
+0

真棒功能!謝謝! – weltschmerz