2010-09-14 89 views
0

我有一個基於Flash的瀏覽器遊戲,它將用戶的分數發送到一個php後端腳本,該腳本將分數和用戶ID存儲在數據庫中。在提供AJAX或Flash請求時避免CSRF

現在我有一個像www.example.com/update.php?score=200 & UID一個url = 234

的問題是,這是非常暴露於智能用戶,他可以用這個url來存儲他想要的數據庫中的任何分數。也沒有真正的用戶身份驗證,我也不打算擁有一個,因爲它確實是一個小遊戲。

如何阻止某人撥打以上網址並自行更新他的分數。

回答

2

您可能想了解一下online polling system的「Marblecake」破解版。

將「提交投票」的概念替換爲「提交得分」,您會發現任何客戶端控件都會失敗。

儘管可以加密分數或使用HMAC防止篡改,但您的加密將在Flash客戶端中完成,並且Flash應用程序可以對關鍵字進行反向設計(它會增加所需的工作量作弊,但不會阻止作弊)。

爲了最大限度地減少作弊,你必須將評分邏輯移動到服務器你必須運行理智檢查或以其他方式驗證玩家的行爲;否則,作弊方法將執行導致更多分數的無效操作,而不是僅報告最終分數。 (最後一點是模糊的,因爲它不清楚這是什麼類型的遊戲)。

至少,你應該能夠將得分更新與特定用戶相關聯,以便作弊者只能影響他們自己的得分而不能其他'。我只能想辦法限制作弊的效果,比如限制速度,所以如果平均遊戲時間爲N分鐘,那麼服務器每小時只能接受60/N分左右的更新。或者使用其他一些度量/時間段。但是,對於你所描述的小型遊戲來說,這可能是不值得的 - 特別是因爲它只能解決問題,所以它不能解決問題。

0

你不能。

這不是CSRF的問題了。由於您沒有任何身份驗證,任何人都可以更新其他人的分數。沒有辦法阻止這種情況的發生。

如果您關心安全性,請認證用戶。這樣至少可以防止攻擊者大量更新分數。

然後,修復您的CSRF問題。對於每個這樣的網址,您都需要添加一個唯一的令牌。

+0

感謝您的回覆。雅我有點認爲這不是一個真正的CSRF問題。我需要改變我的問題: 如果我需要從我的Flash應用程序發送數據到我的服務器,最好的安全防護方法是什麼,這樣不僅任何人都可以自己發送有效數據? 我想我可以加密我的Flash應用程序發送的數據,然後在後端將其解密,並且只有在數據庫有效時才更新我的數據庫。這是假設智能用戶無法弄清楚我如何加密數據。 – Paganwinter 2010-09-17 08:12:21

+0

要做到這一點的唯一方法是使用登錄名/密碼對您的用戶進行身份驗證。加密數據不是解決方案,因爲如果您必須將密鑰存儲在閃存swf文件中,並且智能用戶可以輕鬆地從文件中提取該密鑰。 – 2010-09-17 20:12:51