Laravelアプリ サイバーセキュリティ(SQLインジェクション)

Laravel

概要

Laravelを用いたウェブサイトのサイバーセキュリティについて考察。
サイバーセキュリティに関して全く考えずにコーディングした後、「あれ、セキュリティのこと全く考えてないな」と気づいて調べてみたところ、結果的にlaravelフレームワークでほとんど対策できていた。

本記事では、SQLインジェクションディレクトリトラバーサルを取り上げます。
参考: https://www.ipa.go.jp/security/vuln/websecurity.html

環境

  • Windows 10
  • PHP 8.0.0
  • laravel 8.16.1

SQLインジェクション

概要

データベースを操作するSQL文を操作し、データベースを不正利用する攻撃。
【流れ】

  1. 攻撃者が、入力フォームにSQL文の一部を入力し送信する。
  2. サイト内で、入力情報をもとにSQL文を処理する際、意図しないデータベース操作が行われてしまう。

脅威

  • 非公開データの流出
  • データの改ざん、消去
  • 不正ログイン

Laravelにおける対策

まずは、クエリビルダを使うことを考える。
クエリビルダを使うことによって、PDO(1)パラメータによるバインディング(2)が自動的に使用されることになるため、追加の対策は不要。
*1: PHP Data Objectsの略。データベースの違いを吸収してくれる。
*2: 命令の一部を変数にすること。

クエリビルダを使わず、生のSQL文を使用する場合は、SQL文の条件となるユーザからの入力値に対して、エスケープ処理を施すことが対策となる。ここでは、
' => ''
\ => \\
の変換を行えばよい。
こちらは、laravel特有ではなく、一般的なSQLインジェクション対策。

ディレクトリトラバーサル

概要

設計者が意図しないファイルにアクセスされる攻撃。

脅威

  • ファイルの不正閲覧、ダウンロード

Laravelにおける対策

まずは、外部パラメータをファイルパスとして指定しないようにする。

それが避けられない場合、固定ディレクトリ+ファイル名の構成にする。ファイル名の抽出は、basename関数を用いる。

さらに保険として、ログイン中のユーザIDなどで、適切なアクセス制限をかけると尚良い。

まとめ

XSSやCSRFと同じく、外部からの入力を直接埋め込まないことが基本的な考え方になる。
今回は、Laravel特有のクエリビルダやPHPのbaseline関数を使う方法を紹介した。

タイトルとURLをコピーしました