Post

LaravelではPost http動詞でリクエストされたときのルーティングも行えます。

構文は以下の通りです。

Route::post('ルート',レスポンス);

getのときと似ていますね。

Match

複数のhttp動詞でリクエストされて同一のレスポンスを帰す場合はRoute::matchを使います。

Route::match(['http動詞1','http動詞2'],'ルート',レスポンス);

こんな感じです。

Any

全てのhttp動詞に同一のレスポンスを帰す場合はRoute::anyを使います。

Route::any('ルート',レスポンス);

CSRF

CSRFとは?

CSRF(CrossSiteRequestForgeries – クロスサイトリクエストフォージェリ)についてフィクションの内容で説明していきます。

CSRFの恐怖

会員制SNSサイトAがあります。

hogeさんはサイトAの会員になりました。

ある日hogeさんに一通のメールが届きました。

メールの内容は「サイトAのドメインを移行しました」との内容で新しいURLが貼ってありました。

AさんはそのURLをクリックすると、サイトAの自分のプロフィールが不適切な内容になってしまいました。

その後、メールの内容は嘘の内容と分かりサイトAの管理者にそのことを報告しました。

 

さて、かなり怖い内容ですね。

このように別のサイトから目標のサイトでユーザーに特定の操作をさせるのがCSRFです。

自分の意図しない行為がサイトAで行われてしまったのです…

ではこの状況を作り出してみましょう。

まずサイトAのプログラムから。

<form method="post" action="send.php">
<input type="text" name="message">
<input type="submit" value="送信">
</form>
<?php
if(!is_login()) exit;
echo "「".htmlspecialchars($_POST['message'])."」を送信しました";

そして、サイトAにCSRFを仕掛けるサイト

<body onload="document.csrf.submit();">
<form method="post" action="site-a.site/send.php" name="csrf">
<input name="message" value="不適切な内容">
</form>
</body>

実際にcsrfを仕掛けるサイトにアクセスするとサイトAで不適切な内容が送信されてしまいました。

原因

HTMLのformは送信時にセッションやクッキーなども送信されます。

そのため会員制サイトでもユーザーがログインさえしていればユーザーに任意の操作をさせることが出来るのです。

解決方法

解決方法として以下があがります。

サイトAにしか分からないようなcsrfトークンを発行し、サーバー側でトークンが合致すれば安全というわけです。

Laravelはこのcsrfトークンを標準でサポートしているため、心配する必要はありません。

Laravelでcsrfトークンを発行するにはフォーム中に以下のコードを記述します。

{{ csrf_field() }}

これでcsrfトークンを発行し、サーバー側はLaravelが自動でやってくれます。

ビュールート

ルーティングでビューを表示するにはRoute::get('/',function(){return view('home');})のようにやってきましたが、もっと短くするには以下のようにします。

Route::view('ルート','ビュー名')

モデルを渡すには

Route::view('ルート','ビュー名',[データ]);

このようにします。

パラメーターの初期値

ルートパラメーターに初期値を与えるには以下のようにします。

Route::get('users/{name?}',function($name = 'admin'){
    return view('user.profile',['name' => $name]);
});

パラメーターのところに?を付けて関数の対応する引数の初期値をセットします。

この章のまとめ

ルーティングは奥が深い