概要
Laravelを用いたウェブサイトのサイバーセキュリティについて考察。
サイバーセキュリティに関して全く考えずにコーディングした後、「あれ、セキュリティのこと全く考えてないな」と気づいて調べてみたところ、結果的にlaravelフレームワークでほとんど対策できていた。
本記事では、SQLインジェクションとディレクトリトラバーサルを取り上げます。
参考: https://www.ipa.go.jp/security/vuln/websecurity.html
環境
- Windows 10
- PHP 8.0.0
- laravel 8.16.1
SQLインジェクション
概要
データベースを操作するSQL文を操作し、データベースを不正利用する攻撃。
【流れ】
- 攻撃者が、入力フォームにSQL文の一部を入力し送信する。
- サイト内で、入力情報をもとにSQL文を処理する際、意図しないデータベース操作が行われてしまう。
脅威
- 非公開データの流出
- データの改ざん、消去
- 不正ログイン
Laravelにおける対策
まずは、クエリビルダを使うことを考える。
クエリビルダを使うことによって、PDO(1)パラメータによるバインディング(2)が自動的に使用されることになるため、追加の対策は不要。
*1: PHP Data Objectsの略。データベースの違いを吸収してくれる。
*2: 命令の一部を変数にすること。
クエリビルダを使わず、生のSQL文を使用する場合は、SQL文の条件となるユーザからの入力値に対して、エスケープ処理を施すことが対策となる。ここでは、
' => ''
\ => \\
の変換を行えばよい。
こちらは、laravel特有ではなく、一般的なSQLインジェクション対策。
ディレクトリトラバーサル
概要
設計者が意図しないファイルにアクセスされる攻撃。
脅威
- ファイルの不正閲覧、ダウンロード
Laravelにおける対策
まずは、外部パラメータをファイルパスとして指定しないようにする。
それが避けられない場合、固定ディレクトリ+ファイル名の構成にする。ファイル名の抽出は、basename
関数を用いる。
さらに保険として、ログイン中のユーザIDなどで、適切なアクセス制限をかけると尚良い。
まとめ
XSSやCSRFと同じく、外部からの入力を直接埋め込まないことが基本的な考え方になる。
今回は、Laravel特有のクエリビルダやPHPのbaseline関数を使う方法を紹介した。