-1

假设我有 domain.com/php/ 以及我所有的 php 函数,然后我与 domain.com/frontend/ 的前端开发人员共享一个 ftp 帐户,现在前端可以完成他们的工作并调用“../php/ “ 功能。假设我的 php 代码受到保护是否安全?或者另一种询问方式,他们是否可以查看 php 源代码或以某种方式复制/包含这些文件然后显示它们?

4

2 回答 2

0

您可以通过将用户监禁到一个文件夹来限制用户:

http://allanfeid.com/content/creating-chroot-jail-ssh-access

这样他们就可以访问文件夹来创建文件。然后简单地给他们需要 PHP 文件的路径。或者创建一个对象或者PHP函数模板,让他们调用访问

伪代码:

class GlobalPaths 
function getPathToThisResource(return string)
于 2013-01-18T17:20:50.463 回答
0

您可以使用 UNIX 帐户系统使某些用户无法读取文件。问题是,如果 PHP 文件可以相互包含,它们就可以相互读取源代码。您可以使用 RPC 系统来隐藏后端代码。前端只与 RPC 接口通信,不需要读取后端代码的源代码。

例如,在前端:

<?php
error_reporting(-1);
function ask_backend($cmd, $args) {
    $decoded = json_decode($data = file_get_contents("http://localhost:8800/backend/rpc.php?cmd=" . urlencode($cmd) . "&args=" . urlencode(json_encode($args))),true);
    if ($decoded === null) throw new Exception("invalid data from backend: " . $data);
    if ($decoded["status"] !== "ok") throw new Exception("error occurred on backend: " . $data);
    return $decoded["msg"];
}
?>
The backend says:
<?php
$res = ask_backend("greeter", ["peter"]);
var_dump($res);
?>

在后端,你可以有rpc.php如下:

<?php
error_reporting(-1);
$cmd = $_GET["cmd"];
$gargs = json_decode($_GET["args"],true);
$cmds = [
    "greeter" => function($args) {
        list($name) = $args;
        return "hello " . $name;
    }
];
$res = ($cmds[$cmd]($gargs));
$res =  json_encode(["status"=>"ok", "msg"=>$res]);
echo $res;
?>

这种实现的缺点是您只能传递 JSON 可序列化对象。当然,您可以改用 Protocol Buffers 进行序列化。你甚至不需要使用 HTTP,但我使用了它,因为如果你正在运行 PHP,你可能已经有一个 HTTP 服务器。

请记住,RPC 接口只需要对 localhost 可用!对于您的用例来说最重要的是:前端开发人员不需要阅读源代码。由于它不是公开可访问的,因此您可以考虑在后端使用 PHPDaemon 之类的东西,因为这样可以更轻松地构建适当的 REST 接口。

于 2013-01-18T19:05:07.210 回答