新入社員ブログ 斎藤03[Form Requestについて]

25年度入社の斎藤です。

 今回は、Laravelのバリデーション機能であるForm Requestについて、概要を簡単にまとめ、webアプリケーションへの具体的な導入方法について説明しようと思います。

Form Requestとは

 FormRequestとはLaravelの機能の一つで、フォームから送られてくるデータのバリデーション(検証)を専用のクラスで管理することができます。Form Requestには以下のメソッドが標準機能として存在します。

authrizeメソッド
バリデーションを行う前に、リクエストが認可(オーソライゼイション)されるかどうかを決定します。
return true : バリデーションに処理が進む
return false : バリデーションを行わず、403 Forbiddenを返しリクエストが拒否される

rulesメソッド
フォームデータに対する検証(バリデーション)ルールを定義します。
バリデーションが通らなければ、デフォルトでは直前の画面にリダイレクトされます。
バリデーションルール記述方法 : [ ‘form要素名’=>’ルール1|ルール2…’ ]
※ルール同士は | 記号で繋げる。また、初めのルールと最後のルールを記号で囲む

FormRequestクラスの作成

 Larvelプロジェクトフォルダにて、以下のコマンドでFormRequestクラスを継承した子クラス(今回の例ではSampleRequest)を作成します。
※○○Requestという名称にする
※ディレクトリで区切りたい場合は、クラス名指定を”ディレクトリ名/SampleRequest”とすればよい

以下のような、app/Http/Requests/SampleRequest.phpが作成されます。

今回の例では、SampleRequest内のauthrizeメソッド、rulesメソッドに対して以下のように設定します。

1.authrizeメソッドのリターンを常にtrueに変更
→リクエストが常に認可される

2.rulesメソッドにバリデーションルールを追加
フォームデータに対して以下の内容を検証する
$name : 入力必須、最大20文字
$tel : 入力任意、ハイフン区切りの電話番号形式
$email : 入力必須、メールアドレス形式
$body : 入力必須、最大1000文字

FormRequestバリデーションの実行

 以下では、フォームデータを受け取るコントローラのメソッドを用意し、FormRequestの子クラスであるSampleRequestを依存性注入することで、バリデーションを機能させます。

例として、以下のようなコントローラ(SampleController.php)を用意する
indexメソッド : Sample.indexビュー を表示
postメソッド : formリクエストを受け取る処理

このコントローラに以下の内容を設定することで、postメソッドにバリデーションを適応させる
1.use を用いて app/Http/Requests/SampleRequest を参照する
2.postメソッドの引数部分にSampleRequest $reruest を記述する(依存性注入)

この設定によってpostメソッドでは、SampleRequestで設定したバリデーションを通過したフォームデータのみを受け取ることができるようになります。

最後に

 今回、LaravelのFormRequestについて学んだことで、バリデーション処理を簡単に実装できることを知りました。
 特に便利だと感じた点は、多様なバリデーションルールが初めから用意されている点です。自分で複雑な検証ロジックを書く必要がなく、フォームデータの種類ごとにルールを定義するだけで適切なバリデーションが実行される点は、開発効率を大きく向上させると感じました。

今回の話は以上です。
ありがとうございました。

新入社員ブログ 斎藤02[CSRFについて]

25年度入社の斎藤です。

 今回は、Webアプリケーションに対する代表的な攻撃手法であるCSRF(クロスサイトリクエストフォージェリ)について、概要を簡単にまとめ、CSRF攻撃に対する一般的な対策とLaravelでどのように対策が行われているのかについて説明しようと思います。

CSRFとは

 CSRF(クロスサイトリクエストフォージェリー)は、Webアプリでログイン状態を保持している利用者に、ユーザーの意図しない不正なリクエストを送信させる攻撃手法です。
 正規のリクエスト方法とは異なるリクエストが受け入れられてしまうようなwebアプリの脆弱性が存在する場合に被害にあう可能性があります。
以下に具体的なCSRF攻撃手法の被害までの基本的な流れを銀行webアプリを例に説明します。

【前提条件】
・正規の銀行webサイト(例:https://bank.com)が存在し、送金機能をもつ
・CSRF対策(CSRFトークン)が実装されておらず脆弱性が存在する
※CSRFトークンについては後述

ステップ1:ユーザーが正規サイトにログイン
ユーザーが銀行サイト(bank.com)に正しい方法でログインします。
この際、Cookieが保存され、bank.comへのリクエスト時にはユーザーを識別するために自動的に送信されます。

ステップ2:攻撃者が作成した不正なサイトにユーザーがアクセスする
以下のような方法で不正なサイトにアクセスさせます。
・メールに記載されたリンク
・SNSの広告クリック
・掲示板に貼られたリンク
・他のサイトに埋め込まれた広告
など

ステップ3:不正なサイトのスクリプトが自動実行される

以下のフォームでは、正規の銀行webサイトに対して、攻撃者の口座(to_account)と送金金額(amount)を指定しています。

CSRF対策

 主なCSRF対策方法として、CSRFトークンを使用することが挙げられます。CSRFトークンは正規のページを表示したときにだけ発行される予測不可能なランダムな値です。
 このランダムな値をサーバーが生成してHTMLのFormに埋め込むことで、Form送信時にFormデータに合わせてCSRFトークンをserverへ送信し、フォームの正当性を担保することができます。
※CSRF攻撃では攻撃者はトークンを読み取れません

Laravel(Blade)でのCSRF対策
フォームタグ内に @CSRF を記述することで、Laravelが自動的にフォームに対してCSRFトークンを埋め込んでくれます。

※web.php(ルーティングファイル)では、@CSRFの付与されていないPOST/PUT/PATCH/DELETEリクエスト はエラーで弾かれるようになっています

jQueryのAjax通信でのCSRF対策
Ajax通信でのリクエストにもCSRFトークンを埋め込むことができます。
まず以下のようにBladeのheadタグ内にmataタグを用いてCSRFトークンを埋め込みます。

次にJavaScriptのjQuery.ajaxSetupメソッドに以下の記述を追加することで、metaタグからCSRFトークンを取得して、Ajaxリクエストに含めることができます。
※$.ajaxSetupはajax通信に関連するデフォルト値を変更するメソッド

最後に

 これまで、セキュリティ攻撃といえば不正なサイトに誘導する、webサイト自体に対して悪意ある改変を行うといったイメージを持っていました。
 CSRF攻撃はそれとは全く異なるアプローチで、攻撃者が自分のサイトから正規サイトへリクエストを送信し、ブラウザが自動的にCookieを付与してしまうことで、ユーザーの意図しない操作が実行されてしまうという「正規のフォーム外から攻撃する」という発想は、自分にとって全く考えたことのない視点であったので、非常に興味深く感じました。

今回の話は以上です。
ありがとうございました。

参考

安全なウェブサイトの作り方 – 1.6 CSRF(クロスサイト・リクエスト・フォージェリ)https://www.ipa.go.jp/security/vuln/websecurity/csrf.html

Readouble Laravel 9.x CSRF保護
https://readouble.com/laravel/9.x/ja/csrf.html

「CSRFって美味しいの?」←ハンズオンで実装して理解してみたhttps://qiita.com/Naughty1029/items/c606d4f12e994b46ba58

新入社員ブログ 斎藤01[XSSについて]

25年度入社の斎藤です。

 今回は、Webアプリケーションに対する代表的な攻撃手法であるXSS(クロスサイトスクリプティング)について、概要を簡単にまとめ、XSS攻撃に対する一般的な対策とLaravelでどのように対策が行われているのかについて説明しようと思います。

XSS(クロスサイトスクリプティング)とは

 XSSとは、脆弱性のあるwebサイト上で悪意のあるスクリプトを紛れ込ませることで、Webサイトを閲覧したユーザの環境において、紛れ込ませたスクリプトを実行させる攻撃手法です。具体的なXSSの流れを以下の簡単な例で説明します。

前提条件
・脆弱な掲示板サイトが存在
・投稿内容をそのままHTMLとして表示する仕様(エスケープ処理がない)

※エスケープ処理については後述

ステップ1:攻撃者が悪意のあるスクリプトを投稿
攻撃者が掲示板の投稿フォームに、以下のようなスクリプトを投稿する。

document.cookie:閲覧者のCookie情報を取得
fetch():攻撃者のサーバーにCookie情報を送信

このスクリプトが実行されると、閲覧者のCookie情報が攻撃者のサーバーに送信される仕組みになっている。

ステップ2:被害者が掲示板を閲覧
攻撃者の投稿内容が、閲覧者のブラウザに送信されます。

ステップ3:被害者のブラウザでスクリプトが実行される
被害者のブラウザは、<script>タグの中身を正規のJavaScriptコードとして実行してしまう。

ステップ4:攻撃者に閲覧者のCookie情報が抜き取られる

このようにして攻撃者は、盗んだCookie情報を使って被害者になりすまし、不正に被害者のアカウントでログインすることが可能になります。

今回の例は、XSSの中でも特に格納型XSSと呼ばれる攻撃手法です。ほかに、反射型XSSDOM Based XSSといった攻撃手法も存在します。

XSS対策

 有効な対策としてエスケープ処理を行うことが重要です。
エスケープ処理とは、 <script>のようなウェブページの表示に影響する特別な記号文字を無害な文字(HTMLエンティティ)に置き換えることです。
具体的には以下のような置き換えを行います。

 “<script>”であれば、 &lt;script&gt; に変換される。

Laravelでのエスケープ処理
Laravelでは {{ $変数 }} という記述方法で、変数の中身を自動的にエスケープしてくれる機能があります。


※{{}}内の変数に対して自動でhtmlspecialchars(エスケープ処理のメソッド)を施してくれます

エスケープ処理を行わずに表示させたい場合は、{{!! $変数 !!}}という記述方法を用います。

最後に

 今回、XSS(クロスサイトスクリプティング)ついて学ぶ機会を得たことで、Webアプリケーションのセキュリティに対する理解が深まりました。
特に、攻撃者がどのように悪意のあるスクリプトを実行させるのか、ブラウザのCookie送信の仕組みをどう悪用するのかといった、攻撃の手順と仕組みを理解することで、知らないことに対する不安から、知識に基づいた適切な警戒心へと意識が変化したことが、今回の学びの最も大きな収穫だと考えています。

今回の話は以上です。
ありがとうございました。