私は、特定のPHPスクリプトをデータベースに保存し、必要に応じてそれらを取り出して実行するブラウザアプリケーション用のシステムを作成しています。最初はexec()とpipingを使ってデータベースからスクリプトを取り出し、それらを出力したスクリプトの出力をPHPで試してみました。これは1つのユースケースで動作しますが、すべてではなく、とにかく脆いと感じるので、私はより良い方法を探しています。"php:// memory"ストリームからインクルード
私は現在、メモリ内でPHPファイルストリームを使用してこれを達成しようとしています。たとえば、
$thing = <<<'TEST'
<?php
$thing = array();
print "Testing code in here.";
var_dump($thing);
?>
TEST;
$filename = "php://memory";
$fp = fopen($filename, "w+b");
fwrite($fp, $thing);
//rewind($fp);
fclose($fp);
include "php://memory";
ただし、スクリプトの実行時には何も印刷されません。これはこの手段でも可能ですか?そうでない場合は、これを行う別の方法がありますか?私はファイルシステムにアクセスすることが遅くなると確信しているので、一時的なファイルを書かなくてもそれらから読むことを避けようとしています。 「インクルード」に提供できるURLはありますか?それで、メモリストリームをファイルのように読み取ることができますか?
eval()
私は正しく覚えていれば、1行に限られているので、これを行うとは思いません。
また、「eval = include = hell」という回答はしないでください。管理者以外のユーザーは、データベースに格納されているスクリプトを書き込むためのアクセス権がありません。私は、これが私のアプリケーションのライフサイクルにわたって特別な扱いを必要としていることを知っています。
マイ私は全く間違っていた。 Evalは複数の行で動作します。私もそれを試してみませんでした...それはその後動作すると仮定します。 しかし、メモリに保存されているファイルストリームについてはまだ興味があります。その部分に誰かが答えを持っていれば、感謝しています。 –
ファイルを作成したくない特別な理由はありますか?ファイルシステムはファイルのデータベースです。そして、OMGはそれが危険なことをしないでください。 SQLインジェクションのバグがあったり、あなたのMySQL資格情報の取得/推測/公開を管理したりするとすぐに、管理者だけがこれらのphpファイルに書き込むことができます。insta-remote-code-execution – mensi