我試圖獲得一個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 + "¶ms=" + 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);
}
?>
另外英語不是我的第一語言,所以我不知道是否一切都輸入正確。
驗證他們的身份,然後使用會話cookie和/或訪問令牌。 – chRyNaN
客戶端沒有安全性。無論您的代碼在瀏覽器中做什麼,都可以在控制檯中進行復制,但程度不同。有一些事情可以使它變得更加困難(訪問令牌,如@chRyNaN所說),但最終,您的代碼已顯示出來,並且可以出於任何目的隨意修改。唯一的萬無一失(但是很昂貴)的方式是讓所有的後果都發生在服務器上,就像一些MMO一樣。 – Amadan
@Amadan是對的。所有需要安全的代碼都應該在服務器上執行。訪問令牌僅用於驗證服務器上的用戶身份,以便決定是否執行任務。 – chRyNaN