PHPの最近のブログ記事

例えば、FLASHが外部画像を読み込む場合、FLASHはディレクトリにどんなファイルがあるのか分からないので、ファイルのリストをXMLなどに持つことになるが、更新の際に画像ファイルのアップとXMLの更新が必要でめんどくさいし、ミスも起こりやすい。
なので自動的にXMLを吐き出してくれるPHPを作った。

ソース

<?php
	//GETで受け取ったフォルダ名を適応
	if($_GET["dir"]){
		//上位階層へのパスであればエラーにする
		if (ereg("../", $_GET["dir"])){
			$erorr="セキュリティ上、上位階層は表示できません";
		}
		//ルートパスであればエラーにする
		if($_GET["dir"][0] == "/"){
			$erorr="セキュリティ上、ルートパスは使えません";
		}
		//末尾に"/"がついていなければつける
		if(substr($_GET["dir"], -1, 1) != "/"){
			$_GET["dir"] = $_GET["dir"] . "/";
		}
		$path = $_GET["dir"];
	}else{
		$path = "./";
	}
	//フォルダを開く
	if ($dir = @opendir($path) ) {
		//繰り返しディレクトリ内のファイルを読む
		while(false !== ($file = readdir($dir))) {
			//is_dirは参照が狂うので、パスで指定
			$filePath = $path . $file;
			if (is_dir($filePath)){
				if($file != "." && $file != ".."){
					$dirs[] = $file;
				}
			}else{
				$files[] = $file;
			}
		}
 	}else if($erorr == false){
 		$erorr="ディレクトリを開けませんでした";
 	}
 	//以下出力部分
 	print "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
?>
<info>
<?php
	if($erorr){
		print "\t<erorr message=\"" . $erorr . "\" />\n";
 	}else{
?>
	<dirs>
<?php
	if($dirs){
		foreach($dirs as $value){
			print "\t\t<dir name=\"" . $value . "\" />\n";
		}
	}
?>
	</dirs>
	<files>
<?php
	if($files){
		foreach($files as $value){
			print "\t\t<file name=\"" . $value . "\" />\n";
		}
	}
?>
 </files>
<?php
 }
?>
</info>

出力例

<?xml version="1.0" encoding="UTF-8" ?>
<info>
 	<dirs>
 		<dir name="css" />
 		<dir name="js" />
 	</dirs>
 	<files>
 		<file name="index.html" />
 		<file name="top.html" />
 	</files>
</info>

PHPのファイル名をdirInfo.phpとしたとする
dirInfo.phpにアクセスすると、カレントディレクトリの内容のXMLが吐き出される。
また、dirInfo.php?dir=hogehogeとdirパラメータを渡すことで、hogehogeディレクトリの内容のXMLが吐き出すことができる。

※悪用されると、このPHPを設置したディレクトリ以下で表示権限を持っているファイルは、すべて見られる可能性があるので注意すること。