2015-04-28 75 views
2

我試圖獲得一個JavaScript函數來調用PHP函數來向我的Web服務器寫入文本文件,以便我可以在不使用數據庫的情況下爲我的遊戲存儲簡單數據。但是,這將允許隨機的人從控制檯調用該功能(通過按F12打開),並將文件寫入我的Web服務器。將文件寫入到Web服務器的安全方式

有什麼辦法解決這個問題嗎?一切都錯了嗎?我必須從頭開始嗎?或者它是不可能的?


我當前的代碼:

的test.html:

<script src="js/php.js"></script> 
<button onclick="phpFunc('test.php', 'write(\'Hello, World!\')', alertText);">test</button> 

JS/php.js:

function getReq() { 
    var req = false; 
    if (XMLHttpRequest) req = new XMLHttpRequest(); 
    else { 
     try { 
      req = new ActiveXObject("Msxml2.XMLHTTP"); 
     } catch(e) { 
      try { 
       req = new ActiveXObject("Microsoft.XMLHTTP"); 
      } catch(e) { 
       return false; 
      } 
     } 
    } 
    return req; 
} 

function phpFunc(url, func, success) { 
    sfunc = func.split(")")[0].split("("); 
    rfunc = sfunc[0]; 
    rparams = sfunc[1]; 

    var req = getReq(); 
    if (!req) return false; 
    req.onreadystatechange = function() { if (req.readyState == 4 && req.status === 200) success(req.responseText); } 
    req.open("GET", url + "?t=" + Math.random() + "&func=" + rfunc + "&params=" + rparams, true); 
    req.send(); 
} 

function alertText(text) { 
    alert(text); 
} 

test.php的:

<?php 
    function write($text) { 
     $file = fopen("test.txt", "w"); 
     fwrite($file, $text); 
     fclose($file); 
    } 

    { 
     $func = $_GET["func"]; 
     $params = explode(", ", $_GET["params"]); 
     for ($i = 0; $i < count($params); $i++) { 
      if (is_numeric($params[$i])) $params[$i] = (int)$params[$i]; 
      else $params[$i] = str_replace(array("\"", "'"), "", $params[$i]); 
     } 
     call_user_func_array($func, $params); 
    } 
?> 

另外英語不是我的第一語言,所以我不知道是否一切都輸入正確。

+0

驗證他們的身份,然後使用會話cookie和/或訪問令牌。 – chRyNaN

+1

客戶端沒有安全性。無論您的代碼在瀏覽器中做什麼,都可以在控制檯中進行復制,但程度不同。有一些事情可以使它變得更加困難(訪問令牌,如@chRyNaN所說),但最終,您的代碼已顯示出來,並且可以出於任何目的隨意修改。唯一的萬無一失(但是很昂貴)的方式是讓所有的後果都發生在服務器上,就像一些MMO一樣。 – Amadan

+0

@Amadan是對的。所有需要安全的代碼都應該在服務器上執行。訪問令牌僅用於驗證服務器上的用戶身份,以便決定是否執行任務。 – chRyNaN

回答

2

永遠不要信任客戶端應用程序。

JavaScript應用程序比編譯的應用程序更容易濫用,因爲操縱JavaScript的工具更容易被更多人訪問。

如果可能,讓您的Web服務器接口只允許客戶端報告遊戲中採取的操作,並讓服務器負責確定並記錄結果。您也可以對客戶報告的操作應用「合理性」檢查。

您可以讓人們更難以使用JavaScript混淆作弊。這不是一個銀彈,但它會減少有能力利用JavaScript界面​​操縱遊戲的人羣。

+0

我完全忘記了我做了這個線程,現在超過一年後,我發現了它。我在java中創建了自己的web服務器,現在它運行javascript serverside,我停止編寫我的遊戲,因爲它非常無聊,我不知道還有什麼要補充的。 所以即使我的問題和它的答案在我的問題中給出的具體案例中已經不再真正相關。這將是正確的答案 – DutChen18

0

認證將使其只有登錄的用戶才能訪問寫入文件。

您還可以驗證ajax發送的內容,以便只寫入您編寫的內容whitelist