PHPのサンドボックス

私たちのプロジェクトの1つでは、プラグインを作成してサービスの機能を拡張することができます。
ユーザーは、インターフェイスでアプリケーションプラグインを作成し、PHPでロジックを記述します。
PHPの可能性を制限して、だれも誤ってコーディングしないようにする必要がありました。
保護された環境でPHPコードを実行するためのツールがいくつかあります。別のプロセスでの実行、ファイルへのコードの保存、機能の切り捨てられたcli経由の呼び出し、またはPHP専用の拡張機能の使用。
サービスとアプリケーションの仕様、およびすべてのオペレーティングシステムでサンドボックスを使用できる可能性があるため(Windowsではサンドボックスのプロセスと拡張機能は機能しません)、基本的なPHP設定であるExt_Sandbox_PHPValidatorで小さなクラスが作成されました。

クラスの簡単な説明

内部には2つの関数のみがあります。

php_syntax_error

この関数は、PHPコードの構文が正しいかどうかを確認します(括弧が欠落しているかどうかなど)。
$ code-phpコード(<?phpなし)
$ tokensはオプションのパラメーターです。コードを既にトークンに解析している場合は渡すことができます( token_get_all関数を使用して解析できます)。
この関数は次の形式でエラーを返します:array(Error Mesage、Error Line#)
エラーがない場合、関数はfalseを返します

validatePHPCode

関数はphpコードをチェックし、チェックの結果(trueまたはfalse)を返します。
$ source-<?phpなしのPHPコード
$ functions-許可/禁止された関数
$ enable-ブール値、trueの場合、$関数は許可された関数のリストを含み、falseの場合、禁止された関数のリストを含みます。

例:

<?php require 'PHPValidator.php'; $code = <<<PHP \$b = 1; \$c = 2; \$a = \$b + \$c; echo \$a; class test { public function __construct() { echo 'construct'; } public function foo(\$num) { var_dump(\$num); } } \$test = new test(); \$test->foo(\$a); PHP; // validate the code $validator = new Ext_Sandbox_PHPValidator(); try { // we enable only one function - echo, all others will throw error $validator->validatePHPCode( $code, array('echo'), true); $status = 'passed'; } catch(Exception $ex) { $status = $ex->getMessage(); } echo 'Status of validation is: ' . $status; 


オンラインで試してください: http : //ideone.com/e1qx28

このクラスはGitHubにあります。

Source: https://habr.com/ru/post/J179645/


All Articles