メインコンテンツに移動
セキュリティ

弊社でWebアプリを新規開発する際、PHPを使用することが多いのですが、ここ数年最も使用頻度が高いフレームワークがLaravelです。

少し前まではCakePHPなんかも聞きましたが、今ではすっかりお馴染みになった印象です。

直近のプロジェクトで、Laravelを使用する際のセキュリティ面の設計を行う機会がありましたので、その一部分をご紹介いたします。

IPAについて

IPAとは、日本のIT分野を支える独立行政法人です。

基本情報技術者試験や応用情報技術者試験といった資格試験を聞いたことがあるかもしれませんが、このIPAが執り行っています。

IPAのWebサイトには様々な情報が掲載されていますが、その中の一つとして、「安全なウェブサイトの作り方」というページがあります。

ここから「セキュリティ実装 チェックリスト」というExcelファイルをダウンロードすることができ、セキュリティ設計をする際の参考にすることができます。

セキュリティ設計の一部をご紹介

「セキュリティ実装 チェックリスト」には、脆弱性の種類というカテゴリーに対し、各実施項目が用意されています。

以下は、この実施項目を満たすには、Laravelだとどう実装していくが正しいか、という検討結果の一部になります。 

SQLインジェクション

EloquentのORMやクエリビルダを使用することで回避できます。

Laravelクエリビルダは、PDOパラメーターバインディングを使用して、SQLインジェクション攻撃からアプリケーションを保護します。クエリバインディングとしてクエリビルダに渡たす文字列をクリーンアップやサニタイズする必要はありません。

ただし、DBファサードを使って生SQLを実行する際はこの対象に含まれませんので、SQL文に変数を埋め込みたい際は必ずバインドしてあげる必要があります。

参考:https://readouble.com/laravel/8.x/ja/queries.html

OSコマンド・インジェクション

PHPのsystem()関数やexec()関数の使用は避けます。

また、画面から入力された値をコマンドの引数に直接渡す、といった実装も避けます。

CSRF(クロスサイト・リクエスト・フォージェリ)

BladeファイルのフォームタグからPOSTする際は、必ず @csrf を埋め込みます。

<form method="POST" action="/profile">

  @csrf

  <!-- Equivalent to... -->

  <input type="hidden" name="_token" value="{{ csrf_token() }}" />

</form>

参考:https://readouble.com/laravel/8.x/ja/csrf.html

まとめ

セキュリティ面の設計は、プロジェクトによっても多少方針が変わることもあるかもしれませんが、

IPA推奨に乗っ取った実装方法をひとつ用意しておけば、そこを基に対応もしやすいですし、会社としても統一感を出すことができて良いのではないかなと思っています。

上記でご紹介させていただいた内容は、Laravelの公式ドキュメントに載っているような基本的な内容になります。

ただ、個人的にはそのような内容であっても、どうだったっけ?とリソースを調べることで、再度勉強になったなあと感じました。

 

記事一覧へ戻る