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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Framework

Frameworkは、アプリケーションソフトを開発する際に、一般的な機能をより簡単に、より早く完了させる事を目的とした、ソフトウェアやライブラリのセットを指します。開発にフレームワークを使用する事で、追加で必要となる機能だけを開発するだけで済む為、開発効率の向上が見込めます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

9069閲覧

Laravel5.5 でページへの直接アクセス対策

hidepon

総合スコア206

Framework

Frameworkは、アプリケーションソフトを開発する際に、一般的な機能をより簡単に、より早く完了させる事を目的とした、ソフトウェアやライブラリのセットを指します。開発にフレームワークを使用する事で、追加で必要となる機能だけを開発するだけで済む為、開発効率の向上が見込めます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

2クリップ

投稿2018/01/23 03:34

編集2018/01/23 04:23

Laravel5.5の勉強のためにお問い合わせフォームのようなものを作ってみています。
画面構成は
1 Input.php(入力画面)、
2 Confirm.php(入力エラーがあればエラー画面に、エラーが無ければ確認画面。)
3 Thanks.php(完了画面)
という遷移をします。

例えば、Confirm.php に直接アクセスをしたときに、フロー的には
いやなので、「不適切な操作です」として
Thanks.php に直接アクセスされた場合も同様にしたいと思います。

このときの処理として

public function confirm(Request $request){ $post_array = $request->all(); if(empty($post_array)){ return view('confirm_error'); } //以下ん入力チェックと正常系処理 } public function thanks(Request $request){ // セッションの値を全て取得 $session_array = session()->all(); if(empty($session_array["contact"])){ return view('thanks_error'); } //以下DB登録やセッション破棄など   }

ちなみにroute/web.php

Route::get('/input', 'Contact@index'); Route::post('/confirm', 'Contact@confirm'); Route::get('/thanks', 'Contact@thanks');

エラーメッセージは
「MethodNotAllowedHttpException」
イメージ説明

となっています。

質問を書いているうちに
routeの部分に

Route::get('/confirm', 'Contact@confirm'); Route::post('/thanks', 'Contact@thanks');

を追記すれば良い思ってきましたが、対応策として問題無いのかも含めて教えて頂ければと思います。
宜しくお願いいたします

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

対応策についてですが、それでOKです。(回答投稿後に質問のコードが変わったのでNGとさせてください。)
しかし、フォームで指定するHTTPメソッドはget以外にする必要があります。
(HTTPメソッドの正しい使い方・思想についてはここでは触れません)

php

1// routes.php 2Route::get('/input', 'Contact@index'); 3Route::get('/confirm', function () { 4 return redirect('/input'); 5}); 6Route::post('/confirm', 'Contact@confirm'); 7Route::get('/thanks', function () { 8 return redirect('/input'); 9}); 10Route::post('/thanks', 'Contact@thanks');

html

1<!-- 入力画面 --> 2<form action="confirm" method="post"> 3 <input type="submit" value="確認"> 4 <!-- code --> 5</form> 6 7<!-- 確認画面 --> 8<form action="thanks" method="post"> 9 <input type="submit" value="送信"> 10 <!-- code --> 11</form>

投稿2018/01/23 04:23

編集2018/01/23 05:05
natady

総合スコア606

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hidepon

2018/01/23 04:29

ご回答有難うございます。 ConfirmでPOSTデータの有無をチェックThanks でセッションデータのチェックをしているのですが、よく考えると、Input でcsrf のトークンを発行しているのですが、Confirm,Thanks でこのパラメータの有無をチェックするのも一つかなと思っています。 どちらが正しいとかあるのでしょうか?
natady

2018/01/23 05:12 編集

パラメタみて判断するのはバリデーションの領域だと思うので、ちょっと違う気がします。 どちらかと言うと不正な画面遷移を防ぐのが今回の目的な気がするので、web.phpで弾いちゃってもいいかもしれないです。 回答にweb.phpのサンプルを追記しました。 不正な画面遷移があった際は入力画面にリダイレクトさせるようにしました。 その際は入力画面の頭にメッセージをつけてもいいかもしれないですね。
hidepon

2018/01/23 04:54

そういうことなんですね・・・。なるほどです。無駄なコードを書かなくて済みますね。このようなお問い合わせフォームはすべてPOSTでつながっていくから、getはお断りという考えなのですね。超初心者で申し訳ございません。有難うございました。
natady

2018/01/23 05:00

そうですね。 しかし、将来的にはh_3478さんがおっしゃられている通り、どのMethodNotAllowedHttpExceptionにも対応できるようにHandler.phpで404ページを出すように書いとかないといけないのは覚えておいてください。
hidepon

2018/01/23 05:01

有難うございます。本当に勉強になりました。
guest

0

ルートでpostメゾットを使っている以上、直接アクセスしたらそのエラーが出るのは当たり前ですね。

対応策としては、Handler.phpを編集してエラー画面をカスタマイズするか、matchメゾットにしてコントローラー側で処理するか・・・ってところですかね。

【追記】
matchで書けば、getとpostの両方を1行に書けて楽って話ですね。

//get post のどちらから入ってきても大丈夫! Route::match(['get', 'post'],'/confirm', 'Contact@confirm'));

Handler.phpは編集すればエラーが起きた際に、任意のページとかを表示できます。
詳しくはこの辺読んでみてください。
Laravel5: エラーページを共通化〜どんなステータスコードでもどんと来い!

投稿2018/01/23 04:21

編集2018/01/23 04:31
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hidepon

2018/01/23 04:26

ご返答有難うございます。 回答の直前くらいに間違いに気づいて修正をしたのですが、 Route::get('/confirm', 'Contact@confirm'); Route::post('/thanks', 'Contact@thanks'); これだと不十分ということでしょうか? タイミングが悪くてすみません。
退会済みユーザー

退会済みユーザー

2018/01/23 04:31

追記しておきました!
hidepon

2018/01/23 04:33

おおお!!そんな書き方ができるんですね。ちょっとダイエットができて素敵です!!!有難うございました。ちなみにどちらかを優先するとかいうことではないですよね!?
退会済みユーザー

退会済みユーザー

2018/01/23 04:34

優先とかではないですね。両方対応できるって感じです。
hidepon

2018/01/23 04:47

ご回答有難うございます。 ちなみにですが、ConfirmでPOSTデータの有無をチェックThanks でセッションデータのチェックをしているのですが、よく考えると、Input でcsrf のトークンを発行しているのですが、Confirm,Thanks でこのパラメータの有無をチェックするのも一つかなと思っています。 どちらが正しいとかあるのでしょうか?
退会済みユーザー

退会済みユーザー

2018/01/23 04:55

個人的にはcsrfの有無はチェックしてないですね。csrfがない場合はLaravel側が勝手にエラーとして扱ってくれるので、それこそHandler.phpを編集してエラー画面を表示してます。 POSTデータはちょっとでも知識がある人ならいくらでも改造可能なので、その辺は結構厳重にチェックしてますね。
hidepon

2018/01/23 05:02

ご回答有難うございました。なるほどです。もっと勉強しなくては・・本当にありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問