質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.11%

CakePHPなどでPOST送信などの値の受け取り方

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,511

score 183

現在、CakePHP2.4を使ってWebアプリ開発をしています。

Webアプリ内ではユーザーが入力された値を受け取って、
処理をすることがありますが、
皆様はどのようにして値を受け取りますか?

何も考えなければCakePHPでは
以下のような形で受け取っています。

$name = $this->request->data['name']

受け取った値はデータベースに保存され、
その後、必要に応じてデータベースから取得、
ユーザーの画面に表示されるというイメージです。

もちろん、受け取り方はケースバイケースというのは前提ですが、
それぞれ基本的な取得方法は決めているかと思います。

私の場合は以下のような受け取り方をしています。
実際にはloadModelメソッドなどが別に用意されています。

Userモデルで定義しているバリデーションを通過するかどうかをチェックし、
バリデーションを通過しなければエラーを返しています。
(エラー処理はちょっと適当に書いています)

モデル内で定義しているバリデーションはホワイトリスト方式です。
自由に記述できるような項目については上限文字数のみチェックしています。

$name = $this->checkVariables( 'User', 'name', $this->request->data['name'] );

public function checkVariables( $model, $dataName, $data ){

    $this->Common->loadModel($model);  //指定したモデルを使えるように読み込む
    $this->Common->$model->set(array( $dataName => $data ));  //バリデーションするデータをセット
    if ( $this->Common->$model->validates() ) {
        return $data;
    }

    //エラー処理
    header('HTTP', true, 500 );
    echo "不正な入力値";
    exit;
}

こういった処理を書いておき利用しているのですが、
他の方がどういう感じで処理しているのかが分かりません。

文字エンコーディングチェックも入れた方がいいのでしょうか。
画面に表示する際にはh()でエスケープさせています。


CakePHPの独自の受け取り方などがあるのでしょうか。
他の方がどのように値を取得しているのかお聞きできれば幸いです。

ネット上にもいろいろサンプルがあったりするのですが、
たいていは値取得の部分などは適当に記述されていることが多く、
はっきりとした回答が分かりにくいです。

もちろん、完全に安全ということではなく、
最低限こういう受け取り方はしないとダメでしょ、
というようなことで問題ないです。


もし、これだけでは回答ができなければ、
追加で何が必要か教えていただけますと幸いです。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

CakePHPの独自の受け取り方という点で言えば、Model::save()時にModel::validates()が実行される点ではないでしょうか。
コントローラのコーディング量も減りスマートに書けます。
その分Modelのバリデート部分はしっかり書かないといけませんが・・・。
if(!$this->User->save($this->request->data)){
    throw new InternalErrorException('不正な入力値');
}

ですので私はDBへの保存の際に行うバリデートであればModel::save()時のModel::validates()に任せます。
特にcheckVariables()のような関数を設けてはいません。
Model::invalidate()を個別に行うような特殊なページの場合には設けるかもしれません。


文字エンコーディングチェックは、大抵の場合は正規表現で解決するかと思いますが、
必要なカラムに対しては行うべきだと思います。
// 正規表現例
$validate = array('name_kana' => array(array('rule' => array('custom', '/^[ァ-ヶー  ]*$/u')
                                            , 'message' => '全角カナで入力して下さい。')));
// 関数による文字エンコーディングチェック例(isUTF8()はUTF8判定。コードは省略)
$validate = array('name_kana' => array(array('rule' => 'encodeValidate'
                                            , 'message' => '文字コードが不正です。')));
function encodeValidate($data){
    return isUTF8($data['name_kana']);
}


質問の内容に合っていますでしょうか?
入力値チェックに関しては私も是非他の人の意見もお聞きしたいです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/16 12:10

    ご回答ありがとうございます。

    >ですので私はDBへの保存の際に行うバリデートであればModel::save()時のModel::validates()に任せます。
    なるほどですね、そういう考え方もできるわけですか。

    特に途中でバリデーションなどは行わず、
    DB登録時にまとめてフレームワークのバリデーションの仕組みを利用して、
    バリデーション処理するということでしょうか。

    ただ、これだとDB登録時にはバリデーションが走るのでいいのですが、
    DBからレコードを取得する際にはSQLインジェクションなどの
    脆弱性が残るかなぁと思いまして。

    もちろん、それもCakePHPのfindメソッドを使うので、
    SQLインジェクションもこちらで対策を
    考えなくてもいいところなのかもしれませんが。

    キャンセル

  • 2015/11/16 12:33

    仰る通りで、私の回答はModel::query()等は使わず、Model::find()を使用する事が前提でした。

    どの程度までフレームワークに任せるのか?という話になりそうですね。
    私はほぼ任せっきりで、フレームワーク外の部分のみ個別に対応している感じです。

    キャンセル

  • 2015/11/16 14:50

    ありがとうございます。
    認識はあっていそうでよかったです。

    他の方からの回答も待ちたいと思います。
    色々な意見が見てみたいですね。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る