• 締切済み

PHP ファイルupロードのセキュリティ

ただいま ファイルUPロードするための簡単なPHPプログラムをせいさくしています 。 セキュリティの部分とか足らないところがるとは思うのですが、 下のプログラjムをどうやって改造すればいいのでしょうか? たとえば 容量を制限する。 ファイル種類を限定する等  おしえて頂きたいと思っています。 よろしくお願いたします。 <body> <p><?php if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) { if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"])) { chmod("files/" . $_FILES["upfile"]["name"], 0644); echo $_FILES["upfile"]["name"] . "をアップロードしました。"; } else { echo "ファイルをアップロードできません。"; } } else { echo "ファイルが選択されていません。"; } ?></p> </body> </html>

  • 29wan
  • お礼率12% (1/8)
  • PHP
  • 回答数2
  • ありがとう数1

みんなの回答

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

>たとえば 容量を制限する。 >ファイル種類を限定する等 「等」って言われても、どこまで掘り下げればいいのやら。自分しか使わないスクリプトなら難しく考えることはないですし(苦笑 保存ファイル名についてはすでに指摘があるので省略するとして、 フォーム側で(MAX_FILE_SIZEを指定して)サイズ制限するとか$_FILES['upfile']['size']でサイズを確認するとか実際にテンポラリファイル($_FILES["upfile"]["tmp_name"])のサイズをfilesize()でチェックする・・といったあたりでしょうか。 「種別を限定」の場合はどういうファイルに限定するのかで異なってきますけど、とりあえずは$_FILES["upfile"]["name"]を元に拡張子を確認しますね(アテにはしない)。拡張子などはファイル名を詐称されている可能性が高いので、たとえば画像ファイル限定ならgetimagesize()で画像種別を取得して判断する必要があります。img要素でそのまま返したいケースなど種別から拡張子を付加しておかないといけませんしね(当然「php経由で返す」ならmimeタイプの方が重要です)。

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

基本的なことですが・・・ >move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"]) 保存するファイル名に$_FILES["upfile"]["name"]を使ってはいけません。自分でファイル名を生成してください(charsetがasciiだけという環境ではないですよね)。

29wan
質問者

補足

その基本もわからないんですけどねー

関連するQ&A

  • PHPでのファイルアップロード。リネーム機能実装

    インターネット上でフリーで配布されていたPHPスクリプトです。 <?php if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) { if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"])) { chmod("files/" . $_FILES["upfile"]["name"], 0644); echo $_FILES["upfile"]["name"] . "をアップロードしました。"; } else { echo "ファイルをアップロードできません。"; } } else { echo "ファイルが選択されていません。"; } ?> --- files フォルダにファイルをアップロードするのですが このままアップロードすると、同じファイル名でアップした場合ファイルが上書きされてしまいます。 アップロードした時、[お腹すいた.zip] だった場合、[20120808-1958-お腹すいた.zip]のように 時間と日付を入れたいのですが、私の知識では調べて試してみたのですが、白紙になる限りで うまくいきません。 どなたかご教授頂けませんでしょうか。

    • ベストアンサー
    • PHP
  • アップロードしたファイルをメールで添付したいのですが教えてください

    <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>ファイルのアップロード</title> </head> <body> <p><?php $fradrs = "from@xxxxxxx"; $toadrs = "to@xxxxxxxx"; $subject = "ファイルアップ\n"; $comment = "アライアンスから\n"; $comment .= "ファイルがアップされました\n"; if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) { if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"])) { chmod("files/" . $_FILES["upfile"]["name"], 0644); echo $_FILES["upfile"]["name"] . "をアップロードしました。"; } else { echo "ファイルをアップロードできません。"; } } else { echo "ファイルが選択されていません。"; } mb_language("ja"); $sdmail0 = $toadrs; $mlhed = "From: $fradrs\n"; $rslt = mb_send_mail($sdmail0,$subject,$comment,$mlhed); ?></p> </body> </html> ファイルは、アップされ、メールでのアップ通知をしていますが アップしたファイルを添付するには、どう書けば良いのでしょうか?

    • 締切済み
    • PHP
  • 違いがわかりませんorz

    <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" /> <title>アップロードされたか調べる</title> </head> <body> <p><?php if(isset($_FILES['example'])){ $localFilename=$_FILES['example']['name']; $uploadFile=$_FILES['example']['tmp_name']; if(is_uploaded_file($uploadFile)){ if (move_uploaded_file($_FILES["example"]["tmp_name"], "files/" . $_FILES["example"]["name"])) { chmod("files/" . $_FILES["example"]["name"], 0644); echo '<p>アップロードされたファイルです:'.h($localFilename).'</p>'; }else{ echo '<p>アップロードされていないファイルです:'.h($localFilename).'</p>'; } } function h($string){ return htmlspecialchars($string, ENT_QUOTES); } ?></p> <form method="post" action="" enctype="multipart/form-data"> <p>ファイルをしていしてください</p> <input type="file" name="example" value"" /> <input type="submit" value="送信する" /> </form> </body> </html> ----------------------------------------------------------------------------- ------------------------------------------------------------------------------ <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" /> <title>sample</title> </head> <body> <p><?php if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) { if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"])) { chmod("files/" . $_FILES["upfile"]["name"], 0644); echo $_FILES["upfile"]["name"] . "をアップロードしました。"; } else { echo "ファイルをアップロードできません。"; } } else { echo "ファイルが選択されていません。"; } ?></p> <form method="post" action="" enctype="multipart/form-data"> <p>ファイルをしていしてください</p> <input type="file" name="upfile" value"" /> <input type="submit" value="送信する" /> </form> </body> </html> -------------------------------------------------------------------------- ------------------------------------------------------------------------------- 上と下のプログラムの違いがわかりません。アップロードのプログラムなんですが下の方が成功し、上がエラーになります。よければ、解説つけて上のプログラムを正してください(><) お願いします。

    • ベストアンサー
    • PHP
  • ファイルのアップロード処理を確認画面で確認後にアップロードするようにし

    ファイルのアップロード処理を確認画面で確認後にアップロードするようにしたいのですが、プログラムの書き方がわかりません。確認画面を通さずにやればアップロードできるのですが。どうすればいいのか教えてもらえるとうれしいです。 流れとしては「アップロード画面でファイルを指定」→「確認画面でアップロードボタンを押す」→「アップロード結果画面」です。作成中のソースは以下のようになっています。 ■upload.html(アップロード画面) <html><head><title>アップロード画面</title></head><body> <form action="kakunin.php" method="post" enctype="multipart/form-data"> ファイル:<br> <input type="file" name="upfile" size="30"><br> <input type="submit" value="確認画面へ"> </form></body></html> ■kakunin.php(確認画面)<未完成> <html><head><title>確認画面</title></head><body> <?php $upfile=$_POST['upfile']; print "選択したファイル: $upfile<br>\n"; ?> <br>この内容でよろしいですか?<br> よろしければ「アップロード」ボタンを押してください。<br> <form action="uploadkekka.php" method="post" enctype="multipart/form-data"> <input type="submit" value="アップロード"> </form></body></html> ■uploadkekka.php <html><head><title>アップロード結果</title></head><body> <p><?php if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) { if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "uploadfiles/" . $_FILES["upfile"]["name"])) { chmod("uploadfiles/" . $_FILES["upfile"]["name"], 0644); echo $_FILES["upfile"]["name"] . "をアップロードしました。"; } else { echo "ファイルをアップロードできませんでした。"; } } else { echo "ファイルが選択されていません。"; } ?> </p></body></html>

    • ベストアンサー
    • PHP
  • PHP重複ファイルに連番をつけてアップロードしたい

    ファイルをアップロードするページをPHPで作りました。 testup.htmlでファイルを選択し、 testup.phpでファイルをサーバーにアップする 簡単な仕組みです。 アップロードには成功したのですが、 同じファイル名のデータがある場合、上書きされてしまいます。 上書きされずに、連番等をファイル名に追加してアップロード できればと思いましたが、方法がわかりません。 当方PHPの初心者です。何卒お力をお貸しください。 よろしくお願い致します。 ソースを記入しておきます。 「testup.html」 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>test</title> </head> <body> テストアップローダー<br> <form action="testup.php" method="post" enctype="multipart/form-data"> アップロードするファイルを選択してください。 <br> <input type="file" name="upfile" size="30"><br> <br> <input type="submit" value="アップロード"> <label>  <input type="reset" name="button" id="button" value="リセット" /> </label> </form> </body> </html> 「testup.php」 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>test</title> </head> <body> <p><?php if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) { if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"])) { chmod("files/" . $_FILES["upfile"]["name"], 0777); echo $_FILES["upfile"]["name"] . "をアップロードしました。"; echo "<br><br>ありがとうございました。"; echo "<br><FORM><INPUT TYPE=button value=閉じる onClick=window.close()></FORM>"; } else { echo "ファイルをアップロードできません。"; echo "<br>お手数ですが前の画面に戻ってもう一度ファイルをアップロードしてください。"; echo "<br><FORM><INPUT TYPE=button value=前のページに戻る onClick=JavaScript:history.back()></FORM>"; } } else { echo "ファイルが選択されていません。"; echo "<br>お手数ですが前の画面に戻ってファイルを選択してください。"; echo "<br><FORM><INPUT TYPE=button value=前のページに戻る onClick=JavaScript:history.back()></FORM>"; } ?></p> </body> </html>

    • ベストアンサー
    • PHP
  • 画像アップ

    php初心者です 簡単な画像アップロードを付けたいと思っています それでアップだけはなんとかできたのですが、もう少し機能を付けたいです 付けたい機能は 1.拡張子を調べて限定したい。gif、jpg、pngの三つを許可したい 2.画像の横と縦の幅が指定した幅より大きければ、指定した幅まで縦横比維持で縮小 100*100 3.もう一つのディレクトリに、小さいサムネイルを作りたい。大きさは32*32です 4.拡張子はそのままにして画像の名前をリネームしたいです よろしくお願いします(_ _ <?php $img_name = $_FILES["upfile"]["name"]; $img_size = $_FILES["upfile"]["size"]; $img_type = $_FILES["upfile"]["type"]; if($_REQUEST["up"] != ""){ if($img_tmp != "" and $img_size <= 50000){ $img_message = "名前は: $img_name <br>サイズは: $img_size <br>MIMEタイプは: $img_type"; if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) { if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"])) { chmod("files/" . $_FILES["upfile"]["name"], 0604); print $_FILES["upfile"]["name"] . "をアップロードしました。"; } else { print "ファイルをアップロードできません。"; } } else { print "ファイルが選択されていません。"; } }else{ $size_error = "サイズが大きすぎます"; } } ?> <html> <head> <title>画像アップロード</title> </head> <body> <form name="form" action="" method="POST" ENCTYPE="MULTIPART/FORM-DATA"> <input name="upfile" type="file" size="40"> <input name="up" type="submit" value="アップロード"><hr> </form> <?php print($size_error); ?><?php print($img_message); ?> </body> </html>

    • ベストアンサー
    • PHP
  • phpでのファイルアップロード

    ファイルのアップロードについてご質問があります。 宜しくお願いします。 基礎phpという本でファイルをアップロードするサンプルがあり、このスクリプトでアップロードされたファイルを格納する『upload』というディレクトリをサーバに作成し、スクリプトを実行して、実際にファイルがアップロードできているかffftpにて『upload』ディレクトリの中を見てみると、なにも表示されませんでした。しかしブラウザから http://myドメイン/upload/ファイル名 にアクセスすると表示されます。 ですのでアップロードはできているがファイルが見えないという状態になっております。また『upload』ディレクトリの削除などもできなくなってしまいます。 サーバの設定が関係しているのかとも思ったのですが、サーバの設定を変更することはできないので、プログラムがわで何とかできないでしょうか? 大変申し訳ありませんが宜しくお願いいたします。 以下がそのコードです。 【up.html】 <html> <head><title>File Uploader</title></head> <body> <form method="post" enctype="multipart/form-data" action="up.php"> <input type="file" name="upfile"> <input type="submit" value="upload"> </form> </body> </html> 【up.php】 <html> <head><title>File Uploader</title></head> <body> <p> file uploader </p> <?php $updir = "./upload/"; $filename = $_FILES['upfile']['name']; if (move_uploaded_file($_FILES['upfile']['tmp_name'], $updir.$filename) == FALSE){ print("Upload failed..."); print($_FILES['upfile']['error']); }else { print("<b>" . $filename . "</b> uploaded!"); } ?> </body> </html>

    • ベストアンサー
    • PHP
  • PHPでアップロードしたファイルが開けない

    CSVファイルにDBのデータが入っていて、 これを、phpのフォームでアップロードしてinsertまたはupdateしたいと思っています。 で、以下のようにやったのですが、 ###################################################### update.txtをアップロードしました。 <hr> files/update.txtファイルを開けませんでした ###################################################### と表示されています。 ソースはこんなかんじです。 (タブを全角空白4文字に置換してます) <?php //<fileをおきやすいいちにもってく> if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) {     if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"])) {         chmod("files/" . $_FILES["upfile"]["name"], 0644);         echo $_FILES["upfile"]["name"] . "をアップロードしました。";         } else {         echo "ファイルをアップロードできません。";         }    } else {     echo "ファイルが選択されていません。"; } //</fileをおきやすいいちにもってく> ?> <hr /> <?php //<fileひらく> $filename ="files/" . $_FILES["upfile"]["name"]; $fp = fopen($filename,'r'); print $filename ; if(is_resource($fp)){     die("ファイルを開けませんでした"); } flock($fp,LOCK_SH); //</fileひらく> //<1行ずつアップデート> while(!feof($fp)){ 以下無謀・・・ なお、ディレクトリはこんなかんじです。 #################################################### [root@★ files]# pwd /var/www/admin_html/files [root@★ files]# ls -al /var/www/admin_html/ total 24 drwxr-xr-x 3 mygwdisk mygwdisk 4096 Aug 12 08:25 . drwxrwxr-x 11 root root 4096 Aug 12 05:11 .. -rw-r--r-- 1 root root 51 Aug 12 05:28 .htdigest -rw-r--r-- 1 mygwdisk mygwdisk 2991 Aug 12 09:04 bc-refresh.php drwxrwxrwx 2 mygwdisk mygwdisk 4096 Aug 12 09:10 files -rw-r--r-- 1 mygwdisk mygwdisk 1511 Aug 12 07:44 index.php [root@★ files]# ls -al /var/www/admin_html/files total 12 drwxrwxrwx 2 mygwdisk mygwdisk 4096 Aug 12 09:10 . drwxr-xr-x 3 mygwdisk mygwdisk 4096 Aug 12 08:25 .. -rw-r--r-- 1 apache apache 1657 Aug 12 09:10 update.txt [root@★ files]# "########################################################## どなたかお助けいただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPでファイルアップ

    はじめまして。 PHPを勉強し始めたとこなのですが、いきなり分かりません。 ファイルの中身を見ないで単純なアップが目的です。 ファイルの名前をファイルの名前: html :uploader.html PHP:p141php としています。 アップしたいフォルダは./upフォルダです。 本を見て作っているのですが、何処が間違えているのかもわかません。 何方か教えて下さい。 ソースは uploader.htmlが <!-- saved from url=(0022)http://internet.e-mail --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <title>アップロード</title> </head><body> <form method="post" enctype="multipart/form-data" action="p141.php"> <input type="file" name="upfile"> <input type="submit" value="uploadする"> </form> </body> </html> で p141.phpが <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <title>練習</title> </head> <body> <p> file uploader </p> <?php $updir = "./up/"; $filename = $_FILES['upfile']['name']; if (move_uploaded_file($_FILES['upfile']['tmp_name'], $filename) == FALSE){ print("Upload failed..."); print($_FILES['upfile']['error']); } else { print("<b>" .$filename. "</b> uploaded!"); } ?> </body> </html> です。 PHPがいけるところのサーバーを借りているので細かい設定や 何のソフトを使っているかは分かりません。 OSはLIUNXです。 開発環境はOSがWin2kで秀丸を使って記述しています。

    • ベストアンサー
    • PHP
  • PHPファイル・アップロードに関する質問

    あるPHP技術書籍で掲載のPHPファイル・アップロードの例を試したところ、アップロードするファイル・サイズは、小さいな(数KB)場合が成功、より大きな場合(例えば40KB~)が失敗!何故失敗なのかよく分かりません。ファイル種類には関係なさそうです。 詳しい方に教えて頂ければ助かります。 ※ ご参考 - 1. 具体的なHTML&PHPコードは、次の通りです。 2. 利用環境: 最新版XAMPP、Windows 7、XAMPPデフォルト・ルートをD:のある フォルダーに変更。D:に十分空き領域があると確認済み(数十GB)。 =====HTML===================== <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>fupload</title> </head> <body> <h3>ファイルアップロード</h3> <form method="POST" action="fupload.php" enctype="multipart/form-data"> <!-- MAX_FILE_SIZE は、必ず "file" input フィールドより前になければなりません --> <input type="hidden" name="MAX_FILE_SIZE" value="100000" /> <!-- input 要素の名前が $_FILES 配列での名前となります --> <input name="userfile" type="file" size="70"/> <input type="submit" value="アップロード" /> </form> </body> </html> =====PHP--===================== <?php $uploaddir = './up/file/'; $uploadfile = basename($_FILES['userfile']['name']); echo '<pre>'; //if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir.$uploadfile)) { echo "ファイルアップロードに成功しました。\n"; } else { echo "ファイルアップロードは不成功です。\n"; } echo '<pre>'; ?> =====PHP関連設定(php.ini)========-== ;;;;;;;;;;;;;;;; ; File Uploads ; ;;;;;;;;;;;;;;;; ; Whether to allow HTTP file uploads. ; http://php.net/file-uploads file_uploads=On ; Temporary directory for HTTP uploaded files (will use system default if not ; specified). ; http://php.net/upload-tmp-dir upload_tmp_dir="C:\xampp\tmp" ; Maximum allowed size for uploaded files. ; http://php.net/upload-max-filesize upload_max_filesize=2M ; Maximum number of files that can be uploaded via a single request max_file_uploads=20

    • ベストアンサー
    • PHP

専門家に質問してみよう