ここで、しばらく考えたことがあります。
ユーザーが独自のカスタム テーマをアップロードするアプリケーションを作成しています。つまり、基本的な PHP/XSS/その他のスキルを持っている人にとっては、多くの頭痛の種になる可能性があります。
アップロードされたファイルは、必要なもの (変数) のみにアクセスでき、他には何もアクセスできない、一種のサンドボックス化された閉じた環境で実行したいと考えています。
これは良い習慣であり、どのように行われますか?
任意の html/javascript を安全に許可するには、各ユーザーが独自のサブドメインを持っている必要があります。各ユーザーが独自のサブドメインを持っている場合、Same Origin Policyにより、ユーザーの JavaScript は独自のサンドボックスに制限されます。「安全な html」のみを許可する場合は、 htmlpuriferがオプションであり、1 つのドメインを使用できます。
カスタム PHP を許可することは、もう少し危険です。「共有ホスティング」プロバイダーは、php スクリプトを特定のユーザーとして強制的に実行するsuPHPに依存しています。これには、すべてのユーザーがシステム上に独自のアカウントを持つ必要があります。この防御方法はしばらく前からありました。完璧ではありませんが、うまくいきます。
カスタム テーマのもう 1 つの解決策は、テンプレート エンジンを使用することです。これにより、テンプレートが PHP に完全にアクセスできなくなります。このためのいくつかの一般的なフレームワーク:
ユーザーに PHP へのアクセスを許可したくないため、サンドボックスをサポートするテンプレート エンジンを使用する必要があります。Twigはここでの顕著な例です。
グローバル スコープには常にアクセスできます。
しかし、オブジェクト指向の概念は多くを提供します。できないことは、グローバルなものを隠すことです。あなたができることは、そもそもそれを目に見えるようにしないことです。
しかし、レビューされていないサードパーティのコードを実行するのは難しいことです。可能であれば、ここで何らかのプロセス分離をお勧めします。これは、popen などを使用してプロセスを開くことを意味し、suphp と組み合わせて、制限付きの Linux ユーザーを作成できます。これは十分に可能であり、適切なセキュリティ対策が講じられていれば安全です。
同じプログラム内でコードを実行する良い方法は、テンプレート パターンを使用することです。危険なコードを挿入する可能性のあるファイル全体がロードされるため、クラスでは少し実用的ではありません。ただし、コードから php でカスタム関数を作成できます。関数が呼び出されない限り、コードは実行されません。クラスを変数名に拡張することもできます。これは、ユーザー提供のコードです。ただし、これを安全にすることはほとんど不可能です。
HTMLコードに関しては、はるかに簡単です。きちんとした html があり、良いスタートです。特別なタグのみを許可する良い解決策があります。
javascript は、古い facebook fbml アプリケーションが行っていた方法で「保護」できます。これには、サーバー側の書き換え、動的変数名などが含まれ、非常に複雑です。
私の意見では、外部のカスタマイズを許可する最善の方法は、外部のスタイルシートを許可することです。それらを外部のオリジンからロードするだけで、実際にはセキュリティ上の懸念はありません。
編集: もちろん、任意のコードを解析して特定のステートメントに制限したり、特定のステートメントを拒否したりできますが、これは非常にトリッキーであり、php の場合は非常に厳しい制約です。いくつかの高レベルのアルゴリズム言語に切り替えるか、javascript を使用してクライアント側に移動する方がおそらく良いでしょう。
あなたがやりたいことは本当に危険です。ユーザーが PHP ファイルをアップロードできるようにしないでください。これが、ネット上で多くの PHP フィドラーを見つけられない理由です (ただし、現在はいくつかあります)。
また、JS はいくつかの間接的な方法で危険であり、ほとんど誰もアップロードを許可していません (Tumblr は例外です)。
あなたがすべきことは、ある種のテンプレート エンジンを採用し、ユーザーがアップロードするテンプレートをサニタイズして、スクリプトを削除することです。
セキュリティが問題になるため、テンプレート エンジンを選択する際は、Secuniaなどのセキュリティ アドバイザリを確認してください。