2013-06-25 62 views
1

任何人都可以在ajax聊天中使用簡單的for循環,並使聊天有時會發送1000條消息。 在我的ajax聊天中,每條消息都與日期,時間(時間戳)一起存儲。AJAX聊天 - 防止垃圾郵件服務器雙面?

我需要找出一種方法來防止這個問題,我曾經想過一個,但我不知道我會怎麼做:

防止垃圾郵件郵寄時間

基本上選擇5條消息說明他們的日期,時間顯示少於10秒(一起)。 如果這些消息一起發佈的時間少於10秒,則會阻止用戶離開聊天幾秒鐘。

但我真的不認爲這可以工作,也不知道如何做到這一點。

是否有任何類似或更好的解決方案或提示如何?

+0

爲什麼它不工作?計算某個時間範圍內的最後X個消息對我來說似乎是一個完全合理的解決方案。 – jeroen

+0

可能是,但是如何在特定時間選擇物品? –

+0

你說過你爲每條消息存儲了時間戳,所以只需使用查詢在最近X秒內提取消息的數量即可。 – Pitchinnate

回答

3

在腳本中的一部分,其中,服務器是要保存聊天消息,連接一臺數據庫查詢像

SELECT COUNT(*) 
FROM chat_messages 
WHERE uid='1234' AND timestamp > DATE_SUB(NOW(), INTERVAL 10 SECOND) 
LIMIT 10 

然後檢查如果結果是比你的限值,並返回false,或消息

另一個「在太短的時間發送郵件太多」,也許更好的做法是不僅確定用戶/會話,也是IP和限制的郵件保存到一個IP。許多現代機器人可以很容易地避開會話或非常快地切換IP,所以您應該結合使用多種技術。

還考慮客戶端防止,如散列消息或添加校驗和的消息。許多機器人不會說JavaScript太好。

+0

uid =用戶ID /名稱,對不對? –

+0

是的。你有一個列來標識用戶/會話,不是嗎? – DanFromGermany

+0

「許多機器人不會說JavaScript太好。「我一直認爲,如果有人在亂搞我的AJAX腳本,他們已經達到了javascript的操作級別,比對不起更好的保存 – Martijn

4

編輯:由DanFromGermany發佈的解決方案是一種很好的方法,如果您有數據庫資源要備用。如果數據庫是瓶頸,則可以切換到以下方法:

您對AJAX調用了一個phpfile,比如說process.php。在process.php中,你開始一個會話,並開始一個值$ _SESSION ['lastChatMessage'] = 0;

然後你作出的if/else角落找尋的實際代碼:

// time based check: 
if($_SESSION['lastChatMessage'] > time()-1){ echo "Only one post per second";} 
else{ 
    // some code you use now 
    $_SESSION['lastChatMessage'] = time();// save time of posting 
} 

你也可以將$ lastChatMessage的數組,並在它每次都記得。然後創建一個函數,刪除所有小於time() - $ diffYouWant的值。 一些帖子將保留,這取決於你想要多大的數量:)

if(count($_SESSION['lastChatMessage']) > $maxPostsAllowed){ echo 'No flooding please';} 
else{ 
    // your code 
} 
+0

我同意這一點。查詢數據庫防止垃圾郵件是一個非常糟糕的決定。 – Sharky