2012-05-21 93 views
0

可能重複:
Preventing fraudulent submission to a scoreboard
Prevent Cheating on Javascript Game安全問題與JavaScript變量傳遞到PHP變量

我已經找到一種方法路過我的JavaScript變量PHP變量使用這個:

window.location.href = ".../gameover.php?points=" + points+"&speed="+window.speed; 

gameover.php我使用的網站

$_GET[speed] // and 
$_GET[points] 

訪問我的變量。這些值然後作爲hiscores存儲到數據庫中。但這裏說到我的問題: ,如果用戶只是類型例如

.../gameover.php?points=500000&speed=85 

在地址欄中它還存儲這些變量。

我發現了一些可以幫助避免這種情況的東西,但您仍然可以避開它。在我的主頁上,我做了一個cookie'notcheated',如果用戶訪問該頁面並且未選擇isset,那麼它會銷燬cookie並將這些值存儲在我的hiscores中,但是如果用戶訪問主頁面然後輸入上述地址,例如cookie已設置,但他沒有玩過遊戲,然後這些值也被存儲。

有人有任何建議來保護我的網站,以便人們不能只輸入自己的hiscores。

編輯:我試圖用javascript的文章做到這一點,但沒有奏效。也許我做錯了某人請告訴我一個例子,我應該怎麼做?

回答

0

防止這種情況的唯一方法是在您的PHP代碼中在服務器端執行遊戲邏輯。如果您從客戶端向服務器發送任何積分值,用戶可以作弊。

例子:

/sell.php?money=10 

以上可以被黑客攻擊,通過改變10到1000000相反,考慮一下:

/sell.php?itemid=1234 

然後服務器handes從玩家的庫存移除物品,併爲其賬戶添加適量的資金。

+0

在這種情況下,我沒有看到,作爲一個可行的選擇。得分和時間將通過客戶端計算,然後發送到服務器端,這意味着服務器端無法提前知道這些值。 – Gavin

+0

@Gavin除了在服務器端處理它,沒有具體的解決方案 - 它可以在客戶端始終被篡改。查看其他人提供的鏈接。 – Polynomial

0

如果你的遊戲完全基於javascript,那麼很少有人可以完成,除了用補丁打點 ;高級用戶將始終獲得高分。

如果你的遊戲不時發送一些AJAX時間(而在遊戲中),你可以利用這些信息並把它們在$ _SESSION,因此利用它們還用於更新遊戲。 如果在ajax調用之間發送了一個異常值,那麼用戶會以某種方式被黑客攻擊。

最後,您可以使用這些值,而不是有害的URL。 Cookie也可以在用戶的​​瀏覽器中禁用,不要對它們計數太多。

0

你至少可以限制可能的欺騙行爲而高級用戶通過發送POST請求 - 這是不是在地址欄顯示:https://stackoverflow.com/a/133997/1106393

function post_to_url(path, params, method) { 
    method = method || "post"; // Set method to post by default, if not specified. 

    // The rest of this code assumes you are not using a library. 
    // It can be made less wordy if you use one. 
    var form = document.createElement("form"); 
    form.setAttribute("method", method); 
    form.setAttribute("action", path); 

    for(var key in params) { 
     if(params.hasOwnProperty(key)) { 
      var hiddenField = document.createElement("input"); 
      hiddenField.setAttribute("type", "hidden"); 
      hiddenField.setAttribute("name", key); 
      hiddenField.setAttribute("value", params[key]); 

      form.appendChild(hiddenField); 
     } 
    } 

    document.body.appendChild(form); 
    form.submit(); 
} 

但是,這是一個貧窮的解決方案,因爲它是很容易造假以及。

另一種解決方案是在發送值之前對值進行編碼。所以它們的含義並不明顯。退房「的Javascript的Base64編碼/解碼」在谷歌,例如:

value='1234'  // plain 
value='MTIzNA==' // base64-encoded 

了對Base64編碼的JavaScript函數可以在這裏找到:https://stackoverflow.com/a/133997/1106393

在您將使用以下服務器:

$speed = base64_decode($_POST['speed']); 

http://www.php.net/manual/en/function.base64-decode.php

+0

我試圖用javascript的文章做,但沒有奏效。也許我做錯了某人請告訴我一個例子,我應該怎麼做? –

+0

在我編輯的帖子中檢出函數post_to_url()。但我真的會推薦base64編碼! – AvL

+0

問題是如果我使用base-64編碼,人們會在源代碼中看到我使用過的代碼。如果他們知道我使用了base-64編碼,那麼他們也知道如何對它進行解碼 –