2008-09-03 15 views
28

私は、MySQLデータベースに格納されているPHPを呼び出すページを作成しようとしています。 MySQLデータベースに格納されているページには、ページロード時に実行するPHP(およびHTML)コードが含まれています。MySQLデータベースに保存されているPHPを実行するにはどうすればよいですか?

これを行うにはどうすればいいですか?

+8

感謝。以下の「回答」の多くとは対照的に、これは便利で便利なものです。 PHPコマンドをDBに格納したい場所には、多くのLEGITを使用しています。状況を知らずに「しない」と言うことはちょうど傲慢です。 –

答えて

30

これにはevalコマンドを使用できます。 このアプローチを使用して落とし穴がたくさんあるので、私はこれに反対してお勧めします。デバッグは難しく、セキュリティ上のリスクがあることを意味します(DB内の悪いコンテンツが実行されます)。

たとえば、When is eval evil in php?を参照してください。 Google for EvalはEvilで、別のソリューションを見つけるべき理由の例がたくさんあります。

追加:悪用を参照する別の良い記事はthis blogpostです。不正な評価の使用によって引き起こされた過去のvBulletinとphpMyAdminの悪用を指します。

+0

「Eval is evil」から抜粋:「ユーザーが提供したデータをeval()呼び出しに入れることを許可すると、ハッキングするように要求されています。 - OK、DBに保存された自分のコードを使用して、ダイナミックで迅速なカスタムフォーム生成のための? – Jeffz

+0

@Jeffz悪いコードがそこに終わっていないことを確信している方がいいでしょう。また、なぜあなたはそれをデータベースに貼り付けて、いくつかのコードファイルだけではないでしょうか? –

+0

あなたはあなたが何をしているか知っていれば両方の方法が良いです。 [A]。ファイルベースはより安全です(特にコーディングにはかなり新しい)、[B]。コードにはいくつかのオン・フライトの変更はデシベルを更新するよりも簡単です更新など必要な場合デシベルの方法は、私はあなたの値下げを固定ファイル – Jeffz

2

PHPのeval関数を見ることができます。任意のPHPコードを実行できます。しかし、セキュリティ上の大きなリスクになる可能性があり、避けるのが最善です。

5

eval()機能は他の応答でここでカバーされました。絶対に必要でない限り、evalの使用を制限する必要があることに同意します。 PHPコードをdbに持つ代わりに、たとえば​​というメソッドを持つクラス名を持つことができます。カスタムPHPコードを実行する必要があるときは、dbからフェッチした名前のクラスをインスタンス化し、->execute()を実行してください。これははるかにクリーンなソリューションであり、大きな柔軟性を提供し、サイトのセキュリティを大幅に向上させます。

1

ソース管理システムを使用して、さまざまなインストール(およびその中で異なるモジュール)ごとに異なるフォークを保存することを検討しましたか?それは私が考えることができるアプリケーション構成のいくつかのベストプラクティスの1つになります。あなたのものは珍しい要件ではないので、これは過去に他の人によって解決された問題です。データベースにコードを格納することは、参考になるか、またはベストプラクティスとしてアドバイスされるのが難しいと思います。

あなたは明確化を投稿しました。あなたはおそらく、意図せずに適切な質問を検索して回答を提出したでしょう。

22

簡単:

$x // your variable with the data from the DB 
<?php echo eval("?>".$x."<?") ?> 

助けるが、誰もがそれがどのように悪いと言うために迅速であることがわかり、実際に手助けするのが遅いことはできませんが、多くのアプリケーションでは私のために素晴らしい作品、私に教えてください直接答え...

+1

の(何でも)コンテンツを微調整する、より汎用性があります - あなたはインデントをコードしない場合は4つのスペース、 「」はHTMLタグとして扱われ、非表示になります – dbr

+1

+1このソリューションは実用化されています。 eval($ x)を適用するだけでは、コードを "<"記号で区切ることで問題を解決することはできません。この答えは問題を解決します。ギャップへの乾杯! – Devner

0

私はこれをどのように実行する必要があるコードのブロックについて独自の何かを識別するデータベース内のフィールドを持つことです。その1つの単語は、そのコードのファイル名にあります。私は一緒にphpファイルを指すように文字列を入れます。例:

$lookFor = $row['page']; 

include("resources/" . $lookFor . "Codebase.php"); 

このように、ハッカーがあなたにアクセスできたとしても、悪意のあるコードを直接そこに置くことはできませんでした。彼はおそらく参照語を変更することができるかもしれませんが、実際にファイルをサーバーに直接置くことができないと、彼は良い結果を得ません。サーバーに直接ファイルを置くことができれば、本当に厄介なことをしたいのであれば、あなたは沈んでしまいます。ちょうど私の2セント価値。

はい、ストアドコードを実行する理由はありますが、問題があります。

+1

ハッカーがあなたのDBにアクセスすることができたとしても、この組み込み方法が安全であるという記述は間違っています。文字列の終わりを効果的に取り除く(無視する) "ヌルバイトポイズニング"または "ヌルバイトインジェクション"など、いくつかの悪用にはまだ脆弱です。 http://webcache.googleusercontent.com/search?q [ここ]((https://websec.wordpress.com/2010/02/22/exploiting-php-file-inclusion-overview/)と[こちら]を参照してください。 = cache:www.madirish.net/401)を参照してください。 –

0
データベースから

読むのPHPコードと一意の名前でファイルに保存し、実行するPHPコードやデバッグには、この簡単な方法は、ファイル が含まれます。この質問のための

$uniqid="tmp/".date("d-m-Y h-i-s").'_'.$Title."_".uniqid().".php";  
$file = fopen($uniqid,"w"); 
fwrite($file,"<?php \r\n ".$R['Body']); 
fclose($file);       
// eval($R['Body']); 
include $uniqid; 
関連する問題