- ベストアンサー
データベースの中にあるソースコードを実行させたい
こんにちは。php初心者です。 データベースの中にphpコードを保存して、それをphpで呼び出して中のソースを実行させたいのですがphpコードがそのまま表示されてしまいます。何か良い方法はありますでしょうか? ●データベースの中身 [ID] 0 [contents] $test="テスト"; ●ソース <?php $db = mysql_connect('localhost','root'); mysql_select_db('hoge',$db); $id = mysql_escape_string(0); $sql = "select * from contents where ID = '$id';"; $contents = mysql_query($sql,$db); mb_http_output ( 'UTF-8' ); $aryCol=mysql_fetch_assoc($contents); $a = $aryCol['contents']; echo $a; echo $test; ?> ●実行結果 $test="テスト"; ●開発環境 Apache2.0.59 PHP4.3.2 MySQL4.0.26 と、いうような感じです。実行結果は「テスト」という文字のみ表示させたいのですが、$aに入っているソースコードがそのまま表示されてしまい、$testには何も入っていないままです。 このような処理は不可能なのでしょうか?またデータベースに入っているソースコードの処理を行いたい場合、どのような処理をすればよろしいでしょうか? 私では経験不足なため皆様のお知恵を拝借できればと思い質問させていただきました。くだらない質問で大変恐縮ですがご回答のほうよろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
eval ― 文字列を PHP コードとして評価する という関数がありますが、取り扱いには注意した方がいいと思います。 eval($a); echo $test;
その他の回答 (2)
- cdsdasds
- ベストアンサー率52% (114/217)
>このことは知りませんでした。処理的には変わらないと思っていましたので目から鱗がでるような情報です!もしよければ望ましい理由を詳しく説明されているサイトか書物をご紹介願えませんでしょうか? No.1の回答者が述べておられるように、質問者のやりたいことをファイルではなく、データベースでやろうとするとeval()関数を使用することになります。 No.1の回答者が述べておられるように、eval()関数の利用は取り扱いに注意が必要で、一般的にこの関数をコーディングで用いる際にはセキュリティ的に問題があることが多く、しばしばこの関数を用いずに適切にコーディングした場合より遅いです。これはパースと、変数領域から実行領域へのコード移動というか挿入のオーバーヘッドがばかにならないからです。 質問者の場合は、PHPファイルを読み込む場合に比べて、データベースのレスポンスが十分早いかという問題もあるように思います。チューニング可能な問題ではありますが。 例えば http://ja.wikipedia.org/wiki/Eval に一般的な問題が指摘されています。 セキュリティ的に質問者の場合について怖いと思うのは、eval()で評価されるコード自体が想定外のものとなる可能性を排除できないように思うからです。SQLインジェクションに対する対応は通常のPHPプログラムよりしっかり行う必要があるでしょう。このような対応は往々にしてコードの実行速度を低下させます。 http://www.atmarkit.co.jp/fsecurity/rensai/webhole02/webhole01.html まあ、このような話はエンジニアの感性がどうしても入ってくるところですから、一般的な話以外については最終的にはご自身でということになりますが。
お礼
なるほど!わかりやすく説明していただき本当にありがとうございました! >eval()で評価されるコード自体が想定外のものとなる可能性 については特に納得でした。「SQLインジェクションに対する対応」することによって処理が遅くなるのも納得です。今回はファイル数が多いので正規表現で最低限のチェックはしておきつつデータベースを使おうと思います。以後eval()を使う機会があれば気をつけたいと思います! 忙しい中ご教授頂き誠にありがとうございました!
- cdsdasds
- ベストアンサー率52% (114/217)
そもそも何で、データベースから返ってくる文字列の実行をしないといけないのでしょう。 常識的に考えて、 データベースのデータはローカルファイルに比べて 1.自分のマシンの権限とは別の存在である可能性がある(高い) 2.コードが汚染される危険性がローカルファイルより高い ということからセキュリティ上の観点から、あるいはスケーラビリティや移植性の観点からデータベースから返される文字列をそのままPHPが解釈することは意味がないと思われます。 また、データベースから帰ってくる文字列はJDBC等を介して、変数領域に書き込まれますが、この領域はセキュリティ上実行コードが書かれる領域とは区別されています。 よって仕組み上からも実行はすぐにはできません。 あえて行うなら、 データベースから文字列取得→取得した文字列をシステムコマンドで特定のPHPファイルに書き込む→そのPHPファイルを呼び出すということになるでしょう。 そんなことをする位なら、データベースのコードを全て事前にファイルにして、データベースにはコードではなく、ファイル名を入れておき、データベースから返ってくるPHPファイル名を呼び出すという方がセキュリティ的にも実行速度上も望ましいように思います。 もう一度なぜコードをデータベースから持ってくる必要があるのかご検討ください。
お礼
返信とご忠告ありがとうございます!ここまでの過程は話すと長くなるのですが簡単にまとめると、星の数ほどある「必要かつ不一致なPHPのソースコード」を複数の箇所で使用するため、それぞれ別々のファイルに保存する必要があったのです。開発者側のみの考えなのですが、ファイルとして保存するよりデータベースを使用するほうが見た目もスッキリする上に変更も容易になるためデータベースを使用しました。一言で言うと無駄な処理を省くための使用です。 >そんなことをする位なら、データベースのコードを全て事前にファイルにして、データベースにはコードではなく、ファイル名を入れておき、デ>ータベースから返ってくるPHPファイル名を呼び出すという方がセキュリティ的にも実行速度上も望ましいように思います。 このことは知りませんでした。処理的には変わらないと思っていましたので目から鱗がでるような情報です!もしよければ望ましい理由を詳しく説明されているサイトか書物をご紹介願えませんでしょうか? 頼ってばかりで本当に申し訳ないのですが、よろしくお願いいたします。
お礼
バッチリ表示されました!本当にありがとうございました!