2012-10-25 38 views
2

在我的網站上,我有一個民意調查。這是基於cookie的民意調查。如果用戶投票,我使用當前投票創建一個cookie,因此只有在創建新投票時才能進行投票。我知道用戶可以刪除cookie並重新投票,但這不是問題。基於Cookie的民意調查使用PHP和AJAX

我有一個處理ajax帖子的ajax.php頁面。這裏是代碼:

if(isset($_COOKIE['poll_id']) && $_COOKIE['poll_id'] == $poll_id) 
{ 
// print message that it is already voted, show the results... 
} 
else 
{ 
// update the database and create a cookie 
} 

如果投票是在按鈕單擊進行的,此代碼工作正常。但是,我開始在Firebug這是這樣做的一個JavaScript:

for(var i=0;i<100;i++) { 
    jQuery.post('ajax.php', { 
     //post parameters 
    }); 
} 

而且我得到100票。如果我再次運行腳本,它會失敗,因爲創建了一個cookie,但似乎如果我發出100個同時請求,檢查失敗,因爲我猜系統沒有時間來及時創建cookie,所有更新都會經過。

關於如何解決這個問題的任何建議?

+1

我能想到的是節流的唯一的事情。你在某種方式下只能在相同的幾秒鐘內允許每個ip的N張選票。每5秒鐘一次投票。如果您還沒有分開記錄每個投票,並且存儲IP,那麼您將不得不單獨記錄每個投票。 –

回答

2

這是XSRF來玩。在您的網站中,您應該首先創建一個隨機(正確醃製且足夠安全)的字符串並將其存儲在會話中。在你所有的頁面中,你應該獲得這個會話的價值並且通過表單提交來傳遞它。在檢查用戶輸入時,您應該檢查該值作爲頁面請求的一部分。

現在,如果在投票頁面中發送此內容,並且在ajax.php中您正在檢查該內容,那麼您會發現該值並知道這是一個安全請求。當某人嘗試了一些比firebug/jquery更聰明的功能時,他們將無法訪問/發送此值,並且您的頁面可能會忽略此類請求。

當然,我的解釋是爲了更好/更容易理解而過分簡化。但請仔細閱讀它,這將有助於解決您的情況,並使代碼更健壯。

添加一個簡單的僞代碼示例:

假設第一你隨機XSRF字符串在會議上已經設置。當有人試圖螢火蟲它現在

jQuery.post('ajax.php', { 
    <?php echo $_SESSION['token'];?>, 
    //rest of the post parameters 
}); 

for(var i=0;i<100;i++) { 
    jQuery.post('ajax.php', { 
     //post parameters 
     //cannot access $_SESSION['token'] so cannot pass it.. 
    }); 
} 
+0

我想我明白你在暗示什麼,但是我沒有提交表單,我只用jQuery發佈ajax文章。 – Andrej

+1

@Andrej:我添加了一個簡單的僞代碼示例,它可以幫助您更好地理解。 – raidenace

+0

謝謝,我會盡力實現這個! – Andrej

0

嘗試重定向當你設置cookie,從而使設置Cookie標頭是在請求