CakePHP 2.3でファイルをアップロード・その2 ファイル名を乱数で設定
2014/06/26
Cakephpでファイルのアップロード
ファイル名を乱数にしてセキュリティ向上
先週、CakePHP 2.3でファイルのアップロード処理を作るという記事を書きましたが、今日はその続きです。
前記事のファイルアップロード処理を作る際に、ファイル名をもとのファイル名ではなく、乱数による自動生成されたファイル名を付けるという方法も試してみました。
今回は乱数を元にファイル名を付けていますが、シリアルナンバーを付けたい、といった場合などもこの方法を元にすれば対応は可能ですね。
ベースにしたのは、前回も書いた下記のサイトです。
http://www.almondlab.jp/labs/1043
そのため、View、Model、および、DBの構造は、上記のページと同じですので割愛します。
————–(/Controller/UploadsController.php)
|
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
<?php App::uses('AppController', 'Controller'); /** * Uploads Controller * * @property Upload $Upload */ class UploadsController extends AppController { public $helpers = array('Html', 'Form'); public function index() { $this->Upload->recursive = 0; $this->set('uploads', $this->paginate()); } public function add() { if ($this->request->is('post')) { // 2013.07.19 add 乱数を発生させる処理 $rand = 'abcdefghijklmlopqrstuvwxyzABCDEFGHIJKLMLOPQRSTUVWXYZ0123456789'; $ary_rand = str_split ( $rand ); // array_rand はランダムに配列のキーを取得 for ( $i = 1, $str = ""; $i <= 32; $i++ ) { $rand_key = array_rand ( $ary_rand, 1 ); $str .= $ary_rand[$rand_key]; } $tmp = $this->request->data['Upload']['file']['tmp_name']; if(is_uploaded_file($tmp)) { $file_name = $str; $file = WWW_ROOT.'files'.DS.$file_name; if (move_uploaded_file($tmp, $file)) { $this->Upload->create(); $this->request->data['Upload']['file_name'] = $file_name; if ($this->Upload->save($this->request->data)) { $this->Session->setFlash(__('The upload has been saved')); $this->redirect(array('action' => 'index')); } else { $this->Session->setFlash(__('The upload could not be saved. Please, try again.')); } } } } } } |
————–
途中に乱数を発生させる処理を追加し、ファイル名をそれに置き換える処理になっています。
この処理の要は「move_uploaded_file」でしょうね。それ以外は特に難しいことはないと思います。
途中のコメントの「array_rand はランダムに配列のキーを取得」の次の行にある「32」がランダムで生成する文字列の文字数になりますので、ファイル名の長さを調整したい場合はその数字を変えてもらえればいいでしょう。
また、ファイル名をランダムで取得するには「md5」などが使われていたりもしますが、正確には乱数を取得する関数ではありませんので、それを理解したうえで使った方がいいでしょうね。
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
Windows環境の XAMPPを利用して CakePHPの開発する際の注意点
WindowsベースにXAMPPで環境を構築しCakePHP4を利用したWebシステムを構築する際は、大文字と小文字の違いを意識する必要がある。LinuxベースのWebサーバに移動させたときに不具合で動作しないこともある。
-
-
CakePHP3で /Layout/defult.ctpにある titleタグ、h1タグを編集する方法
CakePHP3でtitleタグ、h1タグのテキストをデフォルトから変更する方法を解説。テンプレートファイルに「$this->assign()」でテキストを指定して「/Layout/defult.ctp」で受け取る。
-
-
MySQL、CakePHP 2.3で「tinyint(1)」の Boolean型の動作を再確認
MySQL+CakePHPの環境で「tinyint(1)」を利用する際の動作を検証。「tinyint(1)」の Boolean型について CakePHPでは自動処理が実施されていることを確認しました。
-
-
CakePHPのバリデーションを入力値・項目の条件によって変える方法を解説
入力された値によってバリデーション(入力チェック)の内容を切り替える。その処理をCakePHPで実装する方法を解説。条件ごとに unset関数を使ってバリデーションを削除する、という方法を採る。
-
-
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でajaxを利用する処理の実装方法を解説。プルダウンを変更するとデータベースの値を取得し検索結果の内容を変更するというような処理を想定。CakePHP3.6以降の CSRF対策対応済。
-
-
CakePHP4で現在処理しているコントローラー名、アクション名を取得する方法
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法を解説。複数の方法があるが、getParam()メソッドを使う方法が汎用性があって便利かも。
-
-
CakePHP3のfriendsofcake/searchでツリーカテゴリーの子階層も含めて検索する方法
CakePHP3のツリービヘイビアを使ったツリーカテゴリーの子階層も含めての検索を検索プラグイン「friendsofcake/search」を使って実現する方法を解説しました。
-
-
CakePHP 2.3でOn Duplicate Key構文を実装
CakePHPで On Duplicate Key構文を Queryを利用して実装する方法をサンプルソース付きで解説します。
-
-
CakePHP4 のコマンドプログラムからコンポーネントを読み込む方法解説
CakePHP4でコマンドプログラムからコンポーネントを呼び出す方法を解説。コントローラーから呼び出すときと大差はないが、use句でコンポーネントを指定する事がポイント。
-
-
CakePHP4で公開側と管理側のデザインテンプレートを分ける方法・setLayout()
CakePHP4でデフォルトのレイアウトファイル「default.php」は管理側に使用し、これとは別のデザインを公開側のページに設定したい、を実装する方法を解説。