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
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP3にデイトピッカー jQuery UI DatePickerを実装する手順の解説
CakePHP3にjQuery UIのDatePickerを実装する手順を説明。併せて、デイトピッカーを設置に関連するCakePHP3の解説と、テーマを変更したり、表記を変更するカスタマイズする方法なども紹介。
-
-
CakePHP3で「SQLSTATE[23000]: Integrity constraint violation」「SQLSTATE[42S22]: Column not found」などのエラーが出たときの確認するポイント
CakePHP3の開発で発生する「SQLSTATE[23000]: Integrity constraint violation」「SQLSTATE[42S22]: Column not found」のエラーには特有の原因もあるため、その説明と対処方法の解説。
-
-
CakePHP 2.3 Search Pluginで検索処理 その6ORDER、sortソートの機能
CakePHPの検索プラグイン Search Pluginの検索処理の中で order、ソートについての解説です。
-
-
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3で「1対多」の連携を中間テーブルを利用した「多対多」の連携に変更するときの手順のまとめ。中間テーブルの設定やModelの変更などを間違いやすい箇所を指摘しながらの解説。
-
-
CakePHP3のCakeDC/UsersのUserHelperでログアウトやreCAPTCHAをカスタマイズ
CakeDC謹製Usersプラグインの紹介。UserHelperを利用し、ログアウトのリンクや権限があるときのみ表示されるリンク、プロフィールページへのリンク、reCAPTCHAの設置方法などを解説。
-
-
CakePHP3でファイルのアップロード処理を自作・解説付き・その1
CakePHP3でファイルをアップロードする処理を、php.netにある「エラーを起こさない」と説明がある処理を参考に作成。サンプルソースとその解説付きで、コピペでも動くし、カスタマイズも簡単!
-
-
CakePHP3で環境変数を設定して本番環境と開発環境を分けて処理をする場合
CakePHP3で開発環境と本番環境とで違う設定ファイルを読み込ませて環境ごとに定数を切り替える方法を解説。Apacheのhttpd.confに環境変数を設定し、それを読み込み判別する。
-
-
CakePHP3の検索プラグイン「friendsofcake/search」の設置方法・CakePHP3.6対応
CakePHP3で検索を担うプラグイン「friendsofcake/search」の紹介。基本的な設置方法の紹介のほか、処理の記述方法のバリエーション、エラーの解説など。CakeDC/searchより導入は簡単!
-
-
CakePHP4でcontrollerで実行したバリデーションエラーをmodelのにマージする方法
CakePHP4でcontrollerで実行したバリデーションの結果をModelのバリデーション結果に追加するメソッド「setError()」「setErrors()」の使い方の解説。
-
-
CakePHP3チュートリアルで日付と時刻のDateTimeでエラーが出たときの対処方法
CakePHP3のブックマークチュートリアルには記載ミスもあり、そのまま動かない個所もある。CakePHP3では namespaceを使うようになったので、classを呼び出すときに¥を追加する必要が!