4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【講義11.php_ファイルアップロード】詰んだことでパーミッションの理解が深まった話

Last updated at Posted at 2021-08-09

#本記事について
今後の開発の参考になればと思い、PHPについて、講義での実体験をまとめたもの。

##PHPのファイルアップロードについて
PHPではformを利用して画像ファイルの受け取り、アップロードが可能。
アップロードの流れは以下の通り
1.formからアップロード
2.tmp領域(一時保存場所)に保存
3.サーバの保存領域に移動
4.データベースに保存場所のパスを登録

##詰んだ内容
ファイルの権限設定をし忘れたことに気づかず、コードの記述ミスやパーミッション権限を疑ってハマった。
パーミッションはアップしたデータの修正、削除のみに使うため、疑うべきところが謝っていた。

##試したこと、疑ったコード
コメントしているfilename_to_save関数まではvar_dumpで確認できた。
そのため、パーミッション部分(if (move_uploaded_file以降以下)を疑った。
以下は、実際に記述したコード。

 

$img = $_FILES['img']['name'];
$img_data = "";

if (isset($_FILES['img']) && $_FILES['img']['error'] == 0) {
    // 送信時OK
    // 送信されてきたファイルの情報を取得
    $uploaded_file_name = $_FILES['img']['name'];
    $temp_path = $_FILES['img']['tmp_name'];
    $directory_path = 'upload/';
    // ファイル名の準備
    $extension = pathinfo($uploaded_file_name, PATHINFO_EXTENSION);
    $unique_name = date('YmdHis') . md5(session_id()) . "." . $extension;
    $filename_to_save = $directory_path . $unique_name;
    if (is_uploaded_file($temp_path)) {
        // ここでtmpファイルを移動する
        // var_dump($temp_path);
        // var_dump($filename_to_save);
        // exit();
        if (move_uploaded_file($temp_path, $filename_to_save)) {
            chmod($filename_to_save, 0644);
            $img_data = $filename_to_save;
        } else {
            exit('Error:アップロードできませんでした');
        }
    } else {
        exit('Error:画像がありません');
    }
} else {
    // 送信時エラー
    exit('Error:画像が送信されていません');
}

// var_dump($filename_to_save);
// exit();

##原因と対策
原因:ファイルの権限設定をし忘れたため。
対策:ファイル権限を設定。※macのみの設定※windowsは特に設定の必要なし
  「htdocs内の画像ファイルを格納するフォルダ」で
  メニュー表示 => 情報を見る => 共有とアクセス権
  全て「読み/書き」に変更 => 歯車ボタン => 内包している項目に適用

余談:
パーミッションを0644から0777に変更しなければ!などととんでもないことをしようとしていた。
今回の講義で指定しているパーミッションは「0644」。
オーナーが「6」、グループは「4」、一般が「4」という事になるので、
オーナーが「rw = 4+2 = 6」で読み込みと書き込みを許可、グループと一般が「r = 4」で読み込みだけを許可していることになる。
「0777」に変更した場合、オーナー、グループ、一般全て読み込み、書き込み、実行を許可すると言う意味になる…
本番環境に実装していたら、ユーザーが画像の読み書き、つまり編集&削除できる。
意味を理解せず、動く(ここでは画像がアップ、編集、削除できる)からといって安易に変更すべきではない。 
最後に「全てを疑え!自分でさえも」と自分にも同じ道を通る人にも伝えたい。

##参考サイト
https://atmarkit.itmedia.co.jp/ait/articles/1605/23/news020.html
http://www.tryhp.net/permission.htm

以上。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?