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のプラグイン「CakeDC/Users」を日本語化・翻訳ファイルもダウンロード可
CakePHP3のユーザ管理、ログイン認証プラグインである「CakeDC/Users」のメッセージを日本語にする手順の解説とともに、日本語の翻訳ファイルを提供。ファイルを設置すれば日本語になる!
-
-
CakePHP4のCakeDC/Usersのログイン時のリダイレクトとユーザ権限管理の設定解説
CakeDC謹製UsersプラグインのCakePHP4版の紹介。ログイン認証後にリダイレクトする先の設定方法についての解説と実運用するために必要なコツを解説。便利な仕組みも仕様の理解があって初めてうまく使いこなせる。
-
-
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
CakePHP3でOGPを設定する方法を解説。fetch、assignを使用しレイアウトファイルに編集した変数にテンプレートファイルから値を指定する。これを利用してOGPを編集する。
-
-
CakePHP3のCakeDC/Users、Authでログインなしでもアクセスを許可する設定
CakePHP3の Authコンポーネントや CakeDC/Usersプラグインなどを利用したユーザ管理・認証システムにおいて、ログインしていなくても見ることができるページの設定方法を解説。
-
-
CakePHP2の検索Plugin CakeDC/Searchで重複を省くgroup by(distinct)の実装方法
CakePHP2の検索プラグイン「CakeDC/Search」で、重複レコードを省くgroup by、distinctを使う方法についての解説。設定する場所はpaginatorの条件とするので、find()関数と同じ。
-
-
CakePHP3でWarning Error: SplFileInfo::openFile()エラーが発生した場合の対処方法
CakePHP3のキャッシュファイルのパーミッションエラー Error: SplFileInfo::openFile()が発生した場合の対応方法解説。app.phpにキャッシュファイルのパーミッション設定を行い、既存のファイルは削除。
-
-
getParam('action')で取得するアクション名は別関数に移動しても不変CakePHP4系、5系では「getParam()」で処理中のアクション名を取得できる。そのアクションから別関数を呼び出してた関数でアクション名を調べたが同一の名称だった。
-
-
CakePHP3でcomposerを利用してライブラリ・プラグインをインストールする方法
CakePHP3でcomposerを使ってパッケージ(ライブラリ、プラグイン)をインストールする方法の解説。PHPを使うのはCakePHP3が初めてというような方への使い方から解説。
-
-
MySQL、CakePHP 2.3で「tinyint(1)」の Boolean型の動作を再確認
MySQL+CakePHPの環境で「tinyint(1)」を利用する際の動作を検証。「tinyint(1)」の Boolean型について CakePHPでは自動処理が実施されていることを確認しました。
-
-
CakePHP3のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)
CakePHP3の英語のメッセージを日本語化(多言語化)する手順を解説。オリジナルのメッセージを作成する方法やプログラムで文言を追加する場合の対応なども解説。