【问题标题】:Secure way to write a file to a web server将文件写入 Web 服务器的安全方法
【发布时间】: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 + "&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);
    }
?>

而且英语不是我的第一语言,所以我不确定是否所有的输入都正确。

【问题讨论】:

  • 验证他们的身份,然后使用会话 cookie 和/或访问令牌。
  • 客户端没有安全性。无论您的代码在浏览器中做什么,都可以在控制台中复制,但难度不同。您可以做一些事情来使其更难(访问令牌,正如@chRyNaN 所说),但最终,您的代码会显示出来,并且可以出于任何目的随意修改。唯一万无一失(但代价高昂)的方法是让所有重要的事情发生在服务器上,就像一些 MMO 一样。
  • @Amadan 是正确的。所有需要安全的代码都应该在服务器上执行。访问令牌只是为了验证服务器上的用户身份,以便它可以决定是否执行任务。

标签: javascript php file xmlhttprequest


【解决方案1】:

永远不要相信客户端应用程序。

JavaScript 应用程序比编译的应用程序更容易被滥用,因为操作 JavaScript 的工具更容易被更多人使用。

如果可能的话,让您的网络服务器界面只允许客户端报告在游戏中执行的操作,并让服务器负责确定和记录结果。您还可以对客户报告的操作应用“合理性”检查。

使用 JavaScript 混淆可以让人们更难作弊。这不是灵丹妙药,但它会减少有技能利用 JavaScript 界面来操纵游戏的人。

【讨论】:

  • 我完全忘记了我发了这个帖子,现在一年多后我找到了。我已经在 java 中创建了我自己的 web 服务器,现在运行 javascript 服务器端,我停止编写我的游戏,因为它很无聊,我不知道还有什么要添加的。因此,即使在我在问题中给出的具体情况下,我的问题及其答案与我不再相关。这将是正确的答案
【解决方案2】:

身份验证将使只有登录的用户才能获得写入文件的权限。

您还可以验证 ajax 发送的内容,以便只写入您 whitelist 的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-03
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    相关资源
    最近更新 更多