セキュリティ
フレームワークが防御する範囲と、アプリケーションが責任を負う範囲は明確に区別されています。セキュリティ上の脆弱性を発見した場合は、公開の Issue を作成せず、[email protected] へ報告してください(件名に [SECURITY] を含めてください)。
フレームワークが提供するもの
| 項目 | 説明 |
|---|---|
| SQL インジェクション | すべての DAO クエリで PDO のプリペアドステートメントを使用 |
| パストラバーサル | ルーターの include パスは public/ の外へ出られない |
| セッションの完全性 | AES-256-CBC + HMAC-SHA256、有効期限は サーバー側 で検証 |
| セッション Cookie | HttpOnly・SameSite をデフォルトで有効化、Secure は自動付与 |
| カラム暗号化 | @encrypt — 合成 IV(完全一致検索が可能)、HMAC 検証、HKDF による鍵導出 |
| 強制ログアウト | $SESSION_NOT_BEFORE ですべてのセッションを無効化(ステートレス) |
アプリケーションの責任
これらの機能は、意図的にフレームワークでは提供していません。 Flexagon が自動的に処理してくれると想定しないでください。
// CSRF — トークンの仕組みは提供されません。状態を変更するリクエストは自分で検証してください。
// 出力のエスケープ — テンプレートは自動エスケープを提供しません。
echo htmlspecialchars($user->getName(), ENT_QUOTES, 'UTF-8');
// マスアサインメント — $_POST をそのまま渡すと、id や role などのフィールドが上書きされる可能性があります。
$user->setByArray(array_intersect_key($_POST, array_flip(['name', 'email'])));
// シリアライズ — getArray()/getJson() はデフォルトですべての getter を含みます。
/** @exclude_from_get_array */
public function getPasswordHash(): string { ... }
リダイレクト先の検証、SSRF の防止、HTML のサニタイズ、適切なセキュリティヘッダーの設定も、アプリケーションの責任です。
HtmlUtil::stripSpecificTag()系のメソッドは正規表現ベースであり、XSS フィルターではありません。これらはタグを整理するためだけの便利なヘルパーです。