忍者ブログ

カウンター

プロモーション

カレンダー

10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

AntinomyMy の実験室

   私のWEBアプリ実験室です!

ブログ内検索

楽天でお買い物

twitter

最新トラックバック

最新コメント

忍者アナライズ

ウェザーニュース

バーコード

本を買う

アクセス解析

Google+

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


  • 2024/11/23 17:09

eval 関数と file_get_contents 関数で作る簡単データ読み込み

PHP の調べ物

久しぶりにメモ。

今回のメモは、PHPのeval 関数を用いて、
eval関数で読み込む内容にスクリプト自体を書き、
PHPで処理させる事が書かれている。
勿論eval関数は、
引数にスクリプトを与えると処理するという代物であるので、
何の変哲も無い、当たり前の事だと感じると思う。

しかし、引数に与える内容を、外部に書かれたファイル
丸々を読み込んで自身に取り込み処理させることが出来るのです。

これは普通に皆が使っている使い方なのだろうか?
基本的に危険を感じて使わないのか、思いついてはいないのではないか?と
思った。

また、その上記な様な使い方をするなら、
include系の関数を使えば良い気がするが、
それらと違い何時でも好きな時に好きなスクリプトを
読み込み、実行した状況を作り出せる。

今回私がなぜこの関数を使おうと思ったか?
それはPHPのスクリプトソースが書かれたファイルにも
エンコードがあり、それを解釈するにもエンコードがある。

Webブラウザで表示するコードにPHPのスクリプトソースも合わせたとしても
データベースから吐き出させるスクリプトコードをどう処理するかなど、
考えなければいけないことと・・・・・①

もしファイルを作りバイナリなどのデータを保存したとしても、
それを今度読み込むときに変数に読み込む処理を書かなければいけない・・・・・・②

レンタルサーバなどの休めのサーバはデータベースを複数持てないので
クラッシュした場合に困ったり、複数ないと使い勝手やパフォーマンスに困る気がする・・・・・・③

これらの理由が大きく、よく考えてみた所、
PHPのソースごとデータとして保存することを思いついた。

つまり、arrayなどや、いろいろな型をそのまま変数にPHPスクリプトを書いて保存して、
それをeval 関数で読み込めば、保存したソース内で指定した変数に値が保存される。

つまり元のソースに存在したかの如く、変数にデータが代入される。


以下2つのソースがサンプルです。
片方は、私が勝手に付けた拡張子です。podという拡張子なのは
PHP of DATA のつもりで付けました、そんな勝手に付けた拡張子なので
後から好きに変えてもらって問題ないです。
同じディレクトリに2つのファイルを置いて下さい。
同じ文字コードで書かれていて、同じ文字コードで解釈される様に設定しておいでください。

尚、PHP of DATA(仮称)側の文字列を作成するスクリプトは
特に載せてないですが、PHPスクリプトを書く要領で記述し、エスケープするPHPスクリプトを
考えて書いて、中の変数部分に好きなデータが埋め込める様にするだけだと思います。

注意点は、元のソースには何処からこの変数は記述があるのか?
と思ってしまうと思うので、その当りを気をつければ良いと思います。

適当なソースですが、参考にどうぞ。


 

ファイル名:<array_string.dop> 以下中身
 


$filedata=array('a'=>777,'b'=>567);
$filedata2=array('a'=>333,'b'=>789);

 

 

ファイル名:<php_of_data.php> 以下中身
 

 


 

<?php

 

$stringVal=<<<'hereDocument'
$arrayString=array('a'=>123,'b'=>555);
hereDocument;

 


eval($stringVal);
echo 'test';
var_dump($arrayString);
echo $arraystring;
echo $stringVal;

 

echo '<br/>file data php read<br/>';

 

$dop=file_get_contents('array_string.dop');

 

eval($dop);
echo $dop;
var_dump($filedata);
var_dump($filedata2);
?>


 






結果

 


test

 

array
  'a' => int 123
  'b' => int 555

$arrayString=array('a'=>123,'b'=>555);
file data php read
$filedata=array('a'=>777,'b'=>567); $filedata2=array('a'=>333,'b'=>789);

array
  'a' => int 777
  'b' => int 567
array
  'a' => int 333
  'b' => int 789

最後に追加の注意点ですが、evalで読み込ませる内容の元であるファイルは、データが内臓されたPHPスクリプトを作成のソース(私が言うpod拡張子)で一定の場所以外は書き込めない様なプロテクト対策が必要だと思います。つまり得体の知れない他のWebに吐き出したり、ユーザーが見ているブラウザに情報を吐き出す可能性があるスクリプトは危険です。 また、内部のデータも同様に、得体の知れないアドレスなどを保管するのは危険です。つまりWeb上の外部のアドレス先は、何時コンテンツが変更になるかわからないので、それらも理解した上で、Web上の外部のアドレスなどを保管するべきです。何にそのアドレスを使うのか、発想が変わった時には危険ですから。 また、データが内臓されたPHPスクリプトを作成のソース(私が言うpod拡張子)は Linux上などであればアクセス制限を施すべきです。ファイルが毎回新たな予測不可能なファイルネームで新規に作成される場合などは、しっかりchmod などでアクセス権限を変更するべきです。 そしてまた、大事な情報であれば、apacheのhtdocs直下などでWebページからアクセス出来る様なそんな場所で使うべきではありません。 こんな感じです。今回は短いメモでした<_ _>


追伸:
include とかでもファイルは読み込めるのと、
phpのserialize 関数もあるので、
特定のPHPソースとして残したい用途以外は
こんな使い方をしなくても良いかもです。

PHPのソースを吐き出すPHPのプログラムを作るのならば話は別ですが^ー^

拍手[0回]

PR


  • 2011/07/14 19:33

コメント一覧

  • お名前
  • Email

  • コメント

  • Vodafone絵文字 i-mode絵文字 Ezweb絵文字
  • パスワード
[PR]