【发布时间】:2015-04-28 00:27:07
【问题描述】:
我正在尝试获取一个 javascript 函数来调用一个 PHP 函数来将一个文本文件写入我的 Web 服务器,这样我就可以在不使用数据库的情况下为我的游戏存储简单数据。但这将允许随机人员从控制台(按 F12 打开)调用该函数,从而将文件写入我的 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 所说),但最终,您的代码会显示出来,并且可以出于任何目的随意修改。唯一万无一失(但代价高昂)的方法是让所有重要的事情发生在服务器上,就像一些 MMO 一样。
-
@Amadan 是正确的。所有需要安全的代码都应该在服务器上执行。访问令牌只是为了验证服务器上的用户身份,以便它可以决定是否执行任务。
标签: javascript php file xmlhttprequest