allow_url_fopen は、デフォルトで有効ですが、allow_url_include はそうではありません。
名前 | デフォルト | 変更可能 | 変更履歴 |
---|---|---|---|
allow_url_fopen | "1" | PHP_INI_SYSTEM | PHP <= 4.3.4 では PHP_INI_ALL。 PHP 4.0.4 から利用可能です。 |
allow_url_include | "0" | PHP_INI_SYSTEM | PHP 5.2.0 から利用可能です。 |
何れも、セキュリティ上の理由により、アプリケーションからは変更できませんが、allow_url_fopen が有効であれば、allow_url_include が無効でも代替方法があります。
function inc( $path ) { // ******************************* // 配列にセット // ******************************* $inc = @file( $path ); // ******************************* // 最初と最後の行を削除 // ******************************* array_shift($inc); array_pop($inc); // ******************************* // 配列をテキストに戻す // ******************************* $GLOBALS['inc_eval_txt'] = implode( "", $inc ); // ******************************* // テキストを実行する // ******************************* eval($GLOBALS['inc_eval_txt']); }
まず、ファイルを配列にセットして、最初と最後の行を取り除きます( <?php と ?> の削除 ) ※ うまくいくように、ファイルの記述方法を定める必要があります。 ( その前提ならば、ただのテキストファイルにするといいです ) ※ ファイルの拡張子は、テキストの内容がサーバによって加工されないものを使います。 テストしてみると解りますが、include を使った場合でも、http 経由で読み込むテキストの拡張子は、php であってはいけません。( .php では サーバがソースコードを返す事が無いからです ) その後、テキストに戻してからグローバル変数に代入して eval して内容を実行します。eval は危険な処理ですが、それはユーザーから受け取ったデータを対象にする場合です。ここでの処理は、本来allow_url_include によって利用可能な信頼できる文字列が対象です。http://winofsql.jp/php/test/print.txt
<?php inc("http://winofsql.jp/php/test/print.txt"); allow_url_inc(); print "<pre>"; $arr = get_defined_functions(); print_r( $arr["user"] ); print "</pre>"; function inc( $path ) { // ******************************* // 配列にセット // ******************************* $inc = @file( $path ); // ******************************* // 最初と最後の行を削除 // ******************************* array_shift($inc); array_pop($inc); // ******************************* // 配列をテキストに戻す // ******************************* $GLOBALS['inc_eval_txt'] = implode( "", $inc ); // ******************************* // テキストを実行する // ******************************* eval($GLOBALS['inc_eval_txt']); } ?>
タグ:PHP