Perlセキュリティパターン
入力バリデーション、インジェクション防止、セキュアコーディングプラクティスを網羅するPerlアプリケーションの包括的なセキュリティガイドライン。
アクティベートするタイミング
- Perlアプリケーションでユーザー入力を処理するとき
- PerlのWebアプリケーション(CGI、Mojolicious、Dancer2、Catalyst)を構築するとき
- セキュリティ脆弱性についてPerlコードをレビューするとき
- ユーザー指定パスでファイル操作を実行するとき
- PerlからシステムコマンドをExecuteするとき
- DBIデータベースクエリを書くとき
仕組み
テイント対応の入力境界から始め、次に外側に移動する: 入力をバリデートしてアンテイントし、ファイルシステムとプロセス実行を制約内に保ち、どこでもパラメータ化されたDBIクエリを使用する。以下の例は、ユーザー入力、シェル、またはネットワークに触れるPerlコードをリリースする前に適用することが期待されるデフォルトを示す。
テイントモード
Perlのテイントモード(-T)は外部ソースからのデータを追跡し、明示的なバリデーションなしに安全でない操作で使用されることを防ぐ。
テイントモードの有効化
アンテイントパターン
入力バリデーション
ブロックリストよりアローリスト
長さ制約
安全な正規表現
ReDoS防止
壊滅的なバックトラッキングは重複するパターンにネストされた量詞が使用されるときに発生する。
安全なファイル操作
3引数open
TOCTOU防止とパストラバーサル
一時ファイルにはFile::Temp(tempfile(UNLINK => 1))を使用し、レースコンディションを防ぐためにflock(LOCK_EX)を使用する。
安全なプロセス実行
リスト形式のsystemとexec
外部コマンドからstdout/stderrを安全にキャプチャするためにはCapture::Tinyも使用する。
SQLインジェクション防止
DBIプレースホルダー
動的カラムアローリスト
DBIx::Class(ORM安全性)
Webセキュリティ
XSS防止
CSRF保護
トークンを検証するときは定数時間比較を使用する。ほとんどのWebフレームワーク(Mojolicious、Dancer2、Catalyst)には組み込みのCSRF保護がある — 手作りのソリューションよりそれらを優先する。
セッションとヘッダーセキュリティ
出力エンコード
常に出力をそのコンテキスト用にエンコードする: HTML用にはHTML::Entities::encode_entities()、URL用にはURI::Escape::uri_escape_utf8()、JSON用にはJSON::MaybeXS::encode_json()。
CPANモジュールセキュリティ
- cpanfileでバージョンをピン留め:
requires 'DBI', '== 1.643'; - メンテナンスされたモジュールを優先: MetaCPANで最近のリリースを確認
- 依存関係を最小化: 各依存関係は攻撃面積
セキュリティツーリング
perlcriticセキュリティポリシー
perlcriticの実行
クイックセキュリティチェックリスト
アンチパターン
忘れないこと: Perlの柔軟性は強力だが規律が必要。Webに面したコードにはテイントモードを使用し、アローリストですべての入力をバリデートし、すべてのクエリにDBIプレースホルダーを使用し、すべての出力をそのコンテキスト用にエンコードする。多層防御 — 単一の層に依存しない。


