Skip to main content

PHP Laravelを安全に保つための5つのヒント

著者
Headshot of DeveloperSteve Coochin

DeveloperSteve Coochin

feature laravel tips

2022年4月21日

0 分で読めます

開発者中心のLaravelは、「Web職人のためのPHPフレームワーク」とよく表現されます。PHPエコシステムで最も広く使われているフレームワークの一つであり、幅広いコミュニティと、あらゆる種類のアプリケーション開発を支える多様な派生プロジェクトがあります。

2011年にバージョン1.0がリリースされたLaravelは、現在、9GAG、BBC、Pfizerなど世界的な企業のWebサイトを支えています。長年にわたって大きく成長したメインプロジェクトは、Webサイトやプラットフォームで幅広く利用される複数のコンポーネントに分かれています。

  • Laravel/core - コミュニティの多くが注目する中心的なプロジェクトで、Laravelを始める人におすすめの出発点です。Webサイトをすばやく立ち上げるために必要なものがすべて揃っており、分かりやすいチュートリアルとドキュメントも用意されています。PHP Composerでは、Laravel/coreのインストール数が24時間あたり平均16,000件を超えています。

  • Laravel/framework - 多くのプロジェクトが依存関係として利用する、Laravelの中核機能をフレームワークとして提供します。2013年にPHP Composerへ登録されて以来、インストール数は1億8,300万回を超え、1日あたり平均86,000件以上のインストールがあります。100万を超えるオープンソースのプラットフォームや製品で依存関係として使われています。

  • Laravel Sails - Laravelの標準的なDocker開発環境で使えるよう特別に設計された、軽量なCLIを中心に構成されています。コンテナを活用したアプローチで、スピードとスケーラビリティに優れたLaravelアプリケーションを構築できます。

PHP Laravelを始める

Laravelの導入はすばやく簡単です。特に、PHPのパッケージマネージャーPHP Composerを使えば手軽に始められます。コマンドラインでcomposer create-project Laravel/Laravel example-appを実行するだけで、新しいプロジェクトを作成できます。続いて、作成したディレクトリにcd example-appで移動し、php artisan serveを実行すれば、Laravelフレームワークに組み込まれたサーバーを利用できます。デフォルトでは、127.0.0.1:8000でローカルサーバーが起動します。

Laravelのダークテーマのホームページ。Laravelのロゴと、Documentation、Laracasts、Laravel News、Vibrant Ecosystemへのリンクが表示されている。

私がLaravelを気に入っている理由の一つは、開発者中心のアプローチが細部まで丁寧に作り込まれていることです。開発者が頻繁に使うツールが組み込まれています。--git flagを使えば、コマンドラインから新しいgitリポジトリを自動で作成できます。--branch="main"フラグを使ってブランチを指定することも可能です。

Laravelを安全に保つ5つの方法

Laravelのインストール環境を安全に保ち、ユーザーを守る方法をいくつか見ていきましょう。

1. フレームワークの設定

アプリケーション開発の各段階に合わせて、早い段階から適切に設定しておくことは、どのプロジェクトにとっても重要です。Laravelでは、.envファイルを使って開発環境と本番環境の設定を行えます。このファイルにはアプリケーションの設定情報が含まれるため、決して公開状態にしないでください。

本番環境では、デバッグモードがオフになっていることを確認してください。APP_DEBUGをfalseに設定すればオフにできます。デバッグモードは開発中には便利ですが、本番環境で無効にすることで、意図しないエラーやパス、重要なシステム情報が一般に公開されるのを防げます。

Laravelのインストール時にアプリケーションキーが生成されていることも確認してください。このキーは、Cookie、セッション署名付きURL、パスワードリセットトークンの対称暗号化に使われます。設定するには、通常artisanコマンドでkey:generateを実行します(Laravelの設定によってはphp artisan key:generateを実行します)。

2. SQLインジェクションを防ぐ

Laravelの大きな利点の一つは、コアフレームワークにEloquent ORMが採用されていることです。接続先のデータベースとやり取りする際、PDOバインディングを利用してSQLインジェクションを防ぎます。

ORMとは、データをオブジェクトとして表現することでデータベースレコードの処理を容易にするソフトウェアです。アプリケーションのデータを保存するデータベースエンジンの上に抽象化レイヤーを設けます。

特にユーザー入力を扱う場合は、Eloquentに加えて、コアPHPを使ってさらにサニタイズすることもできます(ページの読み込みやパフォーマンスに影響する場合を除き、サニタイズは多すぎるということはありません)。詳しくは、PHPでSQLインジェクションを防ぐ5つの方法に関する記事をご覧ください。

ユーザーのセッションとCookieを保護することは、エンドユーザーのデータをできる限り安全に保つための有効な方法です。Laravelでこれらを扱う際には、いくつか注意すべき点があります。

Laravelセッションの設定でHttpOnlyを有効にします。これはconfig/session.phpファイルで設定できます。これによりセキュリティがさらに強化され、JavaScriptからセッションCookieにアクセスできなくなります。また、セッションのアイドルタイムアウトを短く設定し、操作がない状態が続くと自動的にログアウトするようにしましょう。

Cookieのドメイン設定もconfig.session.phpファイルにあります。サブドメインを使用しない限り、Nullに設定してください。Cookieのドメイン属性を設定するとsame originが適用され、ベースドメインのみがCookieを設定できるようになります。また、CookieのSameSite属性をlaxまたはstrictに設定し、ファーストパーティまたは同一サイトに限定することも有効です。

config/session.phpファイルで最も重要な設定項目はHTTPS onlyです。有効にすると、中間者攻撃(MITM)を防ぎ、HTTPSの安全なURLのみを許可できます。

4. アップロードを安全に処理する

必ずMimeTypesを使ってファイルの種類を検証してください。

$request->validate([
    'photo' => 'file|size:100|mimes:jpg,bmp,png'
]);

さらに、次の点にも注意してください。

  • パスやファイル名をユーザーの入力に頼らないでください。必ずハッシュ文字列やシステムが生成した名前を使用します。

  • 可能であればXMLやZIPファイルは避け、扱う場合は安全な方法で処理してください。

  • basename()を使って、不要なディレクトリ遡りを取り除きます。

5. SASTとSCAツールを使う

これらのツールは、コードやパッケージマニフェストをスキャンし、コードとオープンソースパッケージをできる限り安全に保つのに役立ちます。特に重要なのは、継続的なスキャンを設定できることです。パッケージの特定のバージョンに脆弱性が見つかった場合、通知を受け取れます。

プロジェクトのセキュリティカバレッジを高めるために、SASTとSCAを組み合わせて使うガイドをご覧ください。

ソフトウェア構成分析(SCA)

Snyk Open SourceのようなSCAツールは、PHP Composerなどのオープンソースパッケージ管理ソフトウェアを使う場合に特に便利です。SCAツールでComposerマニフェストをスキャンし、特定のオープンソースパッケージのバージョンに既知の脆弱性がないか確認できます。

Laravel/frameworkのバージョン5.8.17未満に影響する、重大なコマンドインジェクション脆弱性を掲載したSnyk Vulnerability DB。
Snyk Open Souceは脆弱性に優先順位を付けるため、重要な問題により迅速に対応できます。

優れたSCAツールは、プロジェクト、オープンソースライブラリ、依存関係を継続的にスキャンし、脆弱性を検出します。毎年、エコシステム内で脆弱性につながる経路が増加していることが確認されています。早期に特定することで、最近のPHP dompdfの脆弱性のような新たに判明した脅威について、いち早く通知を受け取れます。

静的アプリケーションセキュリティテスト(SAST)

Snyk CodeのようなSASTツールは、コードベースに潜む可能性のある脆弱性の特定に役立ちます。これにより、問題が見つかったコード箇所を詳しく調査できます。

PHP向けのSnyk Codeスキャンは、特に役立ちます。懸念のある箇所をハイライトするだけでなく、関数、オブジェクト、フレームワークをさかのぼって詳しく調査できます。

LaravelのFilesystem.phpコードで安全でないMD5ハッシュ化を強調表示した、Snyk Codeのデータフロービュー。
Snyk Code のデータフロービューでは、コード内の潜在的に安全でない領域が強調表示されます。

Snyk Codeは、脆弱性の実例に基づき、修正方法も提示します。

CWE-916に関するSnyk Codeの修正分析画面。パスワードハッシュ化の脆弱性の詳細、対策ガイダンス、PHPでの修正例を表示。
Snyk CodeのFix分析ビューでは、脆弱性の詳細を確認できるほか、修正手順も提案されます。

「PHP artisan」と言うより早くLaravelプロジェクトをスキャン

Snykを使えば、Laravelプロジェクトをすばやく簡単にスキャンできます。まず無料のSnykアカウントを作成し、利用するプラットフォームのログイン手順に従ってください。アカウントを作成したら、プロジェクトのスキャンを開始する方法はいくつかあります。

リポジトリを接続する

新たに見つかった脆弱性について継続的に通知を受け取るなら、これが私の一番のお気に入りで、最も簡単な方法です。Snykのダッシュボードで右上のAdd Projectをクリックし、接続するリポジトリを選択します。クイックメニューに表示されない場合は、Otherをクリックし、インテグレーションページから希望するプラットフォームを選択してください。

GitHub、GitHub Enterprise、GitLab、Bitbucket、Azure Reposとのソース管理インテグレーションを紹介するSnykのインテグレーションページ

アカウントの接続手順を完了したら、設定ページからプロジェクトのリポジトリを接続できます。リポジトリの種類にチェックを入れて、Add selected repositoryをクリックしてください。

「laravel」で検索し、テスト対象としてlaravelリポジトリを選択したSnykのGitHubリポジトリ選択画面。

Snyk CLIをインストールする

Snyk CLIを使えば、数行のコードを実行するだけで、SCAとSASTのツールをコマンドラインに組み込めます。npmまたはYarnを使う方法のほか、スタンドアロン実行ファイルやオペレーティングシステムに応じたインストーラーを使う方法があります。

Snyk CLIのインストール後、snyk –versionを実行して、正しく動作することを確認します。次に、コマンドラインでsnyk authを実行し、Snyk CLIをSnykアカウントに接続してください。デフォルトのブラウザーで認証ページが開きます。

「CLIを認証する」という見出しと[認証]ボタンが表示されたSnyk CLIの認証ページ

Authenticateをクリックすれば、私のお気に入りのCLIコマンドsnyk testを使ってプロジェクトをスキャンできます。

LaravelのサンプルアプリをSnykでテストしたターミナル出力。脆弱なパスは見つからず、npmパッケージの詳細が表示されている。

IDEインテグレーション

スキャンツールはIDEにも統合できます。アプリケーションの構築中にリアルタイムでチェックやスキャンを行えます。たとえば、SnykのVSCodeインテグレーションでは、パッケージや依存関係をリアルタイムでスキャンできます。Visual Studio codeインテグレーションの始め方と、リアルタイムでの動作をご覧ください。

オープンソースプロジェクトへの貢献も忘れずに

特に日頃から利用しているオープンソースプロジェクトには、できる範囲で貢献することを忘れないでください。機能と利用が広がるにつれ、Laravelコミュニティは長年にわたって大きく成長し、プロジェクトを今日の姿へと発展させてきました。

CTFを始めよう

オンデマンドのバーチャル入門ワークショップを視聴して、CTFの課題の解き方を学びましょう。

続きを読む

blog feature snyk container custom base recommendations
Blog

Evo Agentic AppSecのご紹介:AI開発のスピードに対応するセキュリティ

AI駆動型開発のスピードに、従来のセキュリティワークフローは追いついていません。SnykのAgentic AppSecは、セキュリティエージェントが脆弱性を継続的に検出、修正、検証し、人が基準を定められるようにします。

blog feature ai violet
Blog

VulnBump:AIエージェントはビルドを壊さずに脆弱な依存関係を修正できるか?

VulnBumpは、実際の依存関係アップグレード307件を対象にAIエージェントをテストします。脆弱性が解消され、ビルドとテストが成功した場合にのみ、修正としてカウントされます。

Blog

フロンティアモデルは脆弱性を発見した。攻撃者だけがエクスプロイトチェーンを見つけた。

静的解析で欠陥は見つかりましたが、ライブ攻撃テストで侵害につながる連鎖を実証できたのは唯一でした。Evo COS、Claude Security、Claude Code Securityを比較します。