すべてのphp関数を備えたdomain.com/php/があるとします。次に、domain.com/frontend/のフロントエンド開発者とftpアカウントを共有します。これで、フロントエンドは作業を行い、「../php/」を呼び出すことができます" 機能。私のphpコードが保護されていると仮定しても安全ですか? または、別の質問方法として、php のソース コードを表示したり、何らかの方法でそれらのファイルをコピー/インクルードして表示したりする方法はありますか?
2 に答える
ユーザーをフォルダーに投獄することで、ユーザーを制限できます。
http://allanfeid.com/content/creating-chroot-jail-ssh-access
このようにして、ファイルを作成するためのフォルダーにアクセスできます。次に、PHP ファイルが必要なパスを指定します。または、オブジェクトまたは PHP 関数テンプレートを作成して、アクセスを呼び出すことができるようにします。
擬似コード:
class GlobalPaths
function getPathToThisResource(return string)
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 サーバーを使用しているため、HTTP を使用しました。
RPC インターフェイスは localhost からのみ利用可能である必要があることに注意してください! そして、ユースケースにとって最も重要なことは、フロントエンドの開発者がソースを読み取る必要がないことです。一般にアクセス可能ではないため、バックエンドに PHPDaemon などを使用することを検討できます。これにより、適切な REST インターフェイスを簡単に構築できます。