• 締切済み

phpファイルのダウンロードとセキュリティについて

はじめまして、PHPを勉強中の鏑木といいます。 現在phpを使ったサイトを作っており、もうすぐ公開というところまでたどり着きました。テストのため色々なブラウザを使ってサイトを見ていたところ、safariで構成ファイルの一覧という機能を見つけました。 ここにはページを構成するファイルが表示されており、php内部でインクルードしている設定ファイルなどのパスもかかれています。 ちょっと不安になって、ダウンロードソフトでPHPファイルのパスを指定してDLしてみました。 結果、内容は文字化けしていて解読できませんでした。(文字コードをかえても同じでした) 類似する質問を調べたところ、これはPHPが吐き出した何らかの処理?とのことで、ソースの内容はダウンロードできないとのことだったのですが、心配になり質問させていただきました。 PHPファイルは基本的にDLされ、中のソースを見られることはないのでしょうか?もしDLされてしまう可能性があるとしたら、それを回避するような対秘策はあるのでしょうか? 実際にPHPを使われているみなさんはどんなセキュリティ対策を行っているのか、よろしければご指導いただけないでしょうか。 よろしくお願いいたします。

  • PHP
  • 回答数4
  • ありがとう数8

みんなの回答

回答No.4

safariを使おうがなんだろうが、include、requireしかされないファイル というのはブラウザ(HTTP)を介したアクセスを想定していないはずです。 つまり、webroot配下ではないディレクトリに位置すればPHPそのものの 脆弱性、Webサーバの脆弱性などを突かれない限り、中のソースを 晒してしまうことは『基本的』にありません。 webrootが/var/www/html/ならば、includeされるファイルは /var/www/php/includes/などというディレクトリーを作ってそこに 全部突っ込んどけばいいです。 そうするだけでブラウザを介した単純なアクセスは不可能ですし、 PHPの設定でエラーメッセージを出さない設定にしておき、 自作プログラムはディレクトリトラバーサルなどの脆弱性に対応しておけば 簡単にはどうこうする事は出来ないでしょう。

  • altrn
  • ベストアンサー率62% (10/16)
回答No.3

さきほど回答したものです。せっかくなので補足させてください。 (あと、ataru2さんはGDなどを使われているようで、先ほどの回答は少し「知ってるさそんなの」といったレベルのものだったかも知れません。失礼しました。) 基本的には、 「外部からアクセスされることのない(はずの)ファイルは.htaccessでdeny from allしておく」 の方針でいい(十分だ)と思います。ですので、設計段階からできるだけ、 「外部からアクセスするファイル」と「それ以外」を ディレクトリまたは拡張子で区別できるようにしておくと、.htaccessの設定が簡潔ですみます。 ですので、ここまでこだわる必要はないかと思いますが、 「わかりやすい・予想しやすい名前」を心配に思うのであれば、 その上位ディレクトリを、「予想しにくい名前」にしておけば十分かと思います。 some_password/mysql.iniといった形です。 ただこの場合は、mysql.iniファイルへのアクセスをdeny from allするか、.iniすべてをdenyするか、あるいはこれが入っているフォルダに.htaccessをおいてdenyするか、あるいは先ほどは書き漏らしましたが、最上位層に RewriteRule ^(アクセス禁止のディレクトリ) - [F,L] と書いた.htaccessをおいてdenyすれば十分以上だと思います。

  • umota
  • ベストアンサー率46% (150/324)
回答No.2

php ソースをダウンロードされることより あなたの書いたスクリプトに脆弱性がないかチェックしてください。 (SQLインジェクションが有名だが他にもいろいろあります) 検証スクリプトも公開されているので具体的な URL は書きませんが 「php セキュリティ」 で検索してください。

ataru2
質問者

お礼

早速のアドバイスどうもありがとうございました。 実際のところSQLインジェクションの対策は調べておりましたので取り入れていましたが、そのほかについては知識がほとんどありません。 今回の件でWEBの怖さというか、盲点がたくさんあるということを認識しましたので、ぜひ調べてみようと思います。 どうもありがとうございました。

  • altrn
  • ベストアンサー率62% (10/16)
回答No.1

PHPファイルのコードそのものは、普通(PHPとして実行されている場合)は見ることはできません。 外部から見た場合、HTMLファイルと同じです。 (FTPのパスワードを知っている人はFTPから見ることができます。) 問題となるのは、 エラーが発生して、Warning...などとファイル名・行番号が表示されると コードが少し見えますし、またファイル名が知られてしまうので、不正アクセス(高レベルの技術を持っている人にはコードを見られる可能性は否定できません)される可能性もあります。 特に、includeやrequireでPHPファイルを読み込んでいる場合は、 その読み込まれるファイルは不完全である場合が普通で、 それに直接アクセスされると、エラーがでることもありえます。 (たとえばinclude元で変数 $foo='bar' と設定し、include先で echo $foo; とした場合、include先を直接アクセスされると$fooは表示されません。(場合によってはエラー)) ダウンロードソフトを使った場合、 おそらくHTMLとして出力されたあとの"HTMLファイル"がダウンロードされると思います。 ですので、PHPコードが知られることはありませんが、 前述のようにページの(不完全な)一部がHTMLとして表示されていることになっていると思います。 また、コードそのものがダウンロードされてしまう場合には、 ・PHPがインストールされていない場合(PHPが使えないサーバーでPHPファイルにアクセスした場合) ・.php以外の拡張子(たとえば.inc)をつけているときに、そのファイルに直接アクセスされた場合で、かつその拡張子(.inc)がPHPとして動作しない場合。 (ただし、.phpファイルからincludeしたファイルは、どんな拡張子であってもそこに書かれているコードはPHPとして読まれます。つまり、.incファイルは.phpなファイルからincludeされる前提で作られているという状況です。) ともかく一般的に有効な対策をしておこうとするならば、 .htaccessを使う方法が考えられます。 一つ目は、 外部からアクセスされることはないファイル(includeされることでしか使われないファイル)は、 ひとつ(または複数)のフォルダにまとめて入れておき、 そのフォルダにdeny from allと書いた.htaccessを置く。 もうひとつは、 外部からアクセスされることはないファイル(includeされることでしか使われないファイル)は、 拡張子を.incなどとしておき、 最上層に、 <Files ~ "\.inc$"> deny from all </Files> と書いた.htaccessを置く。 あと、私はsafariを使ったことがないのですが、 safariで「php内部でインクルードしている設定ファイルなどのパスを見ることができる」とのことですが、それは本当ですか??それが可能でしたらすごく気になります。

ataru2
質問者

お礼

大変詳しいアドバイスありがとうございました。 とても勉強になります。 教えていただいたhtaccessの設定は取り入れていませんでしたので、ぜひやってみようと思います。 safariについてですが、見えていたのはインクルードしているファイルではありませんでした;あせって早まってしまったみたいで申し訳ないです。(GDライブラリを使い画像として読み込ませたphpファイルのパスでした)ただ、mysql.iniやxx.classなど、察しやすい名前のファイルを使っていると怖くなってきますね…。 もう一度全体を見直してみようと思います。 ありがとうございました。

関連するQ&A

  • PHPでファイルのダウンロードについて

    お世話になります。ダウンロードボタンを付けてファイルのダウンロードを行う処理で困った事になってます。 (DL.php) $file_name=htmlspecialchars(@$_POST['file_name']); $file_name=addslashes($file_name); mb_convert_variables("SJIS-WIN","EUC-JP",$file_name); $file_to=htmlspecialchars(@$_POST['file_to']); $file_to=addslashes(@$_POST['file_to']); header ("Content-Disposition: attachment; filename=".$file_name); header ("Content-type: application/octet-stream"); require_once("dl_config.php"); readfile ($data_pas.$file_to); dl_config.php <?PHP $data_pas="/data/"; ?> この状態でテキストファイルをダウンロードすると、DLしたファイルの中に不要な改行ファイルが挿入されています。 またrequire_once("dl_config.php");を削除し readfile ($data_pas.$file_to);を readfile ("/data/".$file_to);とすると、改行は入らなくて、正常なファイルがダウンロードされます。 よろしくお願いします。

    • 締切済み
    • PHP
  • ダウンロードしたらなぜかphpファイルに・・・

    サイトから、動画ファイルやrarファイルをダウンロードしようとしたら、 なぜか、別名のphpファイルがダウンロードされます。 どうしたらいいんでしょうか? そのサイトは以前から使っていてこんな事はなかったんですが・・・ お願いします。

  • php_value include_pathを無効

    php_value include_pathを、あるディレクトリ以下では、無効にしたいのですが、 どうすればよいでしょうか? ■前提 ・サイト全体は、「.htaccess」に「php_value include_path」を書いて制御 ■やりたいこと ・ある特定ディレクトリ「hoge」以下では、「php_value include_path」ではなく、 PHPに直接書いた「require_once './★★/●●';」を利用したい ・つまり、設定ファイル「.htaccess」に記述した中のある一部分(特定ディレクトリ以下)だけは、「PHPソースに記述」したincludeパスを使いたい ■試してみてダメだってこと ・「hoge」に「.htaccess」を設置し、空の「php_value include_path=""」と書いてみたけど、うまくいきませんでした

    • ベストアンサー
    • PHP
  • PHPファイル ダウンロード

    サイト上で楽譜をダウンロードしようとたら、PHPファイルというものになっていてダウンロードも印刷もできませんでした。 このような場合どうやったら印刷やダウンロードができるようになりますか? よろしくお願いします。

  • PHPでネット上のPDFファイルを保存

    どこかのサイト上で公開されているPDFファイルを、絶対パスで指定して、ローカルPCにダウンロードさせたいと思っています(ファイル名はダウンロード先のファイル名のまま保存)。 これがPHPのプログラムで可能ならば、ソース例をご提示いただきたく、お願いいたします。

    • 締切済み
    • PHP
  • PHPのinclude('ファイル名')で指定できてしまうのはなぜ?

    お世話になります。 Smartyでテンプレートを用いながらPHPで開発を行っております。 たとえば、あるファイルからSmarty.class.phpをincludeする時 にinclude('Smarty.class.php')でどうやらincludeできている ようなのですが、、なぜ!?なのでしょうか? イメージ的には、include('パス')もしくはphp.iniに設定されている ディレクトリ直下のファイルというイメージなのですが。。 php.iniをのぞいてみるとinclude_pathはコメントアウトされている のですが・・ 疑問です。 ご教授お願いいたします。

    • ベストアンサー
    • PHP
  • phpファイルをダウンロードすることはできますか?

    相手のホームページに、phpと拡張子のつくファイルがあるのですが、 ダウンロードできません。どんな内容なのか見てみたいのですが無理 なのでしょうか?ご存知の方、教えてください。宜しくお願い致します。 ちなみに、iriaでダウンロードを試みたのですあエラーとなって ダウンロードできませんでした。

    • ベストアンサー
    • PHP
  • サーバにあるエクセルファイルをダウンロード

    サーバ内にあるエクセルファイルをダウンロード画面からsubmitして、ダウンロードしたいのですが、ダウンロードしたファイルの内容が文字化けします。またなぜかダウンロード画面のhtml内容が張り付いてたりします。 XML形式で保存したエクセルファイルは問題なく保存→表示できるのですがどうしたらいいのか原因がわかりません。 ダウンロードのソースは、以下のようになっています。 <?php $out_path = mb_convert_encoding($file_path,"SJIS","UTF-8"); $out_file_name = basename($out_path); $file_size = filesize($out_path); header("Content-Type: application/vnd.ms-excel"); header("Content-Disposition: attachment; filename=\"" .     $out_file_name . "\""); header("Content-Length: ".$file_size); readfile($out_path); ?> ちなみに環境は以下のようになっています。 OS :XP 文字コード:UTF-8 framework :symfony 原因をご存知の方、ご教授よろしく御願いします。

    • 締切済み
    • PHP
  • YOUTUBE ダウンロード

    よろしくお願いいたいます。 OSX 10.6.7 safari5.0.5です。 通常YouTubeのDLは普通に構成ファイル一覧より行っていますが、たまに別ウインドウで、 「http://v10.lscache8.c.youtube.com/videoplayback?sparams・・・」が立ち上がり、flvファイルが再生されてしまいDL出来ないことが有ります。 その場合はDLサイトの力を拝借してDLしますが、なぜSAFARIでDL出来ない場合が有るのでしょうか?

    • ベストアンサー
    • Mac
  • PHP:wavファイルのダウンロード

    音楽ファイルを会員に配信するサイトを運営しています。 mp3は問題なくダウンロード・再生できるのですが、wavファイルはダウンロードしてもファイルが破壊されており、再生できません。 wavファイルのバイト数に変化はありませんでした。FTPからファイルをダウンロードすると正常に再生できるので、問題はウェブでのダウンロードをする過程にあることは分かっています。いろいろ調べているのですがそれ以降の原因が分からず困っています。 誰か原因をご存知の方、目星の付く方などおられましたら、ぜひ解答お願いいたします。 ファイルダウンロードには、以下のようなphp関数を使っています。 function download_file($path_file){ if (!file_exists($path_file)) { die("Error: No Such File."); } if (($content_length = filesize($path_file)) == 0) { die("Error: File size is 0.(".$path_file.")"); } if($_POST['sort'] == mp3){ header("Content-Type: audio/mpeg"); }elseif($_POST['sort'] == wav){ header("Content-Type: audio/x-wav"); } header("Content-Disposition: attachment; filename=\"" .basename($path_file)."\""); header("Content-Length: ".$content_length); header("Content-Transfer-Encoding: binary"); $handle = fopen($path_file, 'rb'); while (!feof($handle)) { echo fread($handle, 4096); ob_flush(); flush(); } fclose($handle); }

    • 締切済み
    • PHP