コーディングエージェント(Claude Code、Aider、Codexなど)のカスタムタスクによる直接比較。合格率、コスト、時間、一貫性メトリクスを測定
無料GitHub で公開
laravel-security
Laravelセキュリティベストプラクティス — 認証/認可、バリデーション、CSRF、マスアサインメント、ファイルアップロード、シークレット、レート制限、セキュアなデプロイメント。
含まれるファイル(1)
- SKILL.md8.6 KB
SKILL.md(原文)
インストールする前に、エージェントに与えられる指示の中身を確認できます。
Laravelセキュリティベストプラクティス
一般的な脆弱性から保護するためのLaravelアプリケーション向け包括的なセキュリティガイダンス。
アクティベーション条件
- 認証または認可の追加
- ユーザー入力とファイルアップロードの処理
- 新しいAPIエンドポイントの構築
- シークレットと環境設定の管理
- 本番デプロイメントの強化
仕組み
- ミドルウェアがベースライン保護を提供(
VerifyCsrfTokenによるCSRF、SecurityHeadersによるセキュリティヘッダー)。 - ガードとポリシーがアクセスコントロールを適用(
auth:sanctum、$this->authorize、ポリシーミドルウェア)。 - フォームリクエストがサービスに到達する前に入力を検証・整形(
UploadInvoiceRequest)。 - レート制限が認証コントロールと併せて不正利用保護を追加(
RateLimiter::for('login'))。 - データの安全性は暗号化キャスト、マスアサインメントガード、署名付きURL(
URL::temporarySignedRoute+signedミドルウェア)から。
コアセキュリティ設定
- 本番では
APP_DEBUG=false APP_KEYは必ず設定し、漏洩時にはローテートSESSION_SECURE_COOKIE=trueとSESSION_SAME_SITE=lax(機密アプリではstrict)を設定- 正しいHTTPS検出のためにトラステッドプロキシを設定
セッションとCookieの強化
- JavaScriptアクセスを防止するために
SESSION_HTTP_ONLY=trueを設定 - 高リスクフローには
SESSION_SAME_SITE=strictを使用 - ログインと権限変更時にセッションを再生成
認証とトークン
- API認証にはLaravel SanctumまたはPassportを使用
- 機密データには短寿命トークンとリフレッシュフローを優先
- ログアウトと漏洩アカウントでトークンを取り消し
ルート保護の例:
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
Route::middleware('auth:sanctum')->get('/me', function (Request $request) {
return $request->user();
});
パスワードセキュリティ
Hash::make()でパスワードをハッシュし、平文を保存しない- リセットフローにはLaravelのパスワードブローカーを使用
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rules\Password;
$validated = $request->validate([
'password' => ['required', 'string', Password::min(12)->letters()->mixedCase()->numbers()->symbols()],
]);
$user->update(['password' => Hash::make($validated['password'])]);
認可: ポリシーとゲート
- モデルレベルの認可にはポリシーを使用
- コントローラーとサービスで認可を適用
$this->authorize('update', $project);
ルートレベルの適用にはポリシーミドルウェアを使用:
use Illuminate\Support\Facades\Route;
Route::put('/projects/{project}', [ProjectController::class, 'update'])
->middleware(['auth:sanctum', 'can:update,project']);
バリデーションとデータサニタイズ
- 常にフォームリクエストで入力を検証
- 厳密なバリデーションルールと型チェックを使用
- 派生フィールドにリクエストペイロードを信頼しない
マスアサインメント保護
$fillableまたは$guardedを使用し、Model::unguard()を避ける- DTOまたは明示的な属性マッピングを優先
SQLインジェクション防止
- Eloquentまたはクエリビルダーのパラメータバインディングを使用
- 厳密に必要でない限り生SQLを避ける
DB::select('select * from users where email = ?', [$email]);
XSS防止
- Bladeはデフォルトで出力をエスケープ(
{{ }}) {!! !!}は信頼でき、サニタイズ済みのHTMLにのみ使用- リッチテキストは専用ライブラリでサニタイズ
CSRF保護
VerifyCsrfTokenミドルウェアを有効に保つ- フォームには
@csrfを含め、SPAリクエストにはXSRFトークンを送信
SanctumによるSPA認証では、ステートフルリクエストが設定されていることを確認:
// config/sanctum.php
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost')),
ファイルアップロードの安全性
- ファイルサイズ、MIMEタイプ、拡張子を検証
- 可能な場合はパブリックパスの外部にアップロードを保存
- 必要に応じてマルウェアスキャン
final class UploadInvoiceRequest extends FormRequest
{
public function authorize(): bool
{
return (bool) $this->user()?->can('upload-invoice');
}
public function rules(): array
{
return [
'invoice' => ['required', 'file', 'mimes:pdf', 'max:5120'],
];
}
}
$path = $request->file('invoice')->store(
'invoices',
config('filesystems.private_disk', 'local') // set this to a non-public disk
);
レート制限
- 認証と書き込みエンドポイントに
throttleミドルウェアを適用 - ログイン、パスワードリセット、OTPにはより厳格な制限を使用
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
RateLimiter::for('login', function (Request $request) {
return [
Limit::perMinute(5)->by($request->ip()),
Limit::perMinute(5)->by(strtolower((string) $request->input('email'))),
];
});
シークレットと認証情報
- ソース管理にシークレットをコミットしない
- 環境変数とシークレットマネージャーを使用
- 漏洩後にキーをローテートし、セッションを無効化
暗号化属性
保存時の機密カラムには暗号化キャストを使用。
protected $casts = [
'api_token' => 'encrypted',
];
セキュリティヘッダー
- 適切な場所にCSP、HSTS、フレーム保護を追加
- HTTPSリダイレクトを適用するためにトラステッドプロキシ設定を使用
ヘッダーを設定するミドルウェアの例:
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
final class SecurityHeaders
{
public function handle(Request $request, \Closure $next): Response
{
$response = $next($request);
$response->headers->add([
'Content-Security-Policy' => "default-src 'self'",
'Strict-Transport-Security' => 'max-age=31536000', // add includeSubDomains/preload only when all subdomains are HTTPS
'X-Frame-Options' => 'DENY',
'X-Content-Type-Options' => 'nosniff',
'Referrer-Policy' => 'no-referrer',
]);
return $response;
}
}
CORSとAPIの公開
config/cors.phpでオリジンを制限- 認証付きルートにはワイルドカードオリジンを避ける
// config/cors.php
return [
'paths' => ['api/*', 'sanctum/csrf-cookie'],
'allowed_methods' => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'],
'allowed_origins' => ['https://app.example.com'],
'allowed_headers' => [
'Content-Type',
'Authorization',
'X-Requested-With',
'X-XSRF-TOKEN',
'X-CSRF-TOKEN',
],
'supports_credentials' => true,
];
ロギングとPII
- パスワード、トークン、完全なカード情報をログに記録しない
- 構造化ログで機密フィールドをリダクト
use Illuminate\Support\Facades\Log;
Log::info('User updated profile', [
'user_id' => $user->id,
'email' => '[REDACTED]',
'token' => '[REDACTED]',
]);
依存関係のセキュリティ
composer auditを定期的に実行- 依存関係を注意深くピン留めし、CVE発生時には迅速に更新
署名付きURL
一時的な改ざん防止リンクには署名付きルートを使用。
use Illuminate\Support\Facades\URL;
$url = URL::temporarySignedRoute(
'downloads.invoice',
now()->addMinutes(15),
['invoice' => $invoice->id]
);
use Illuminate\Support\Facades\Route;
Route::get('/invoices/{invoice}/download', [InvoiceController::class, 'download'])
->name('downloads.invoice')
->middleware('signed');
レビュー
まだレビューはありません。使ってみた感想をお寄せください。
同じリポジトリのスキル
概要と使いどころ
hage-oyaji/everything-claude-code-jp-local32026年3月29日 更新
AIエージェントのアクションスペース、ツール定義、オブザベーションフォーマットを設計・最適化し、タスク完了率を向上させる
hage-oyaji/everything-claude-code-jp-local32026年3月29日 更新
評価ファーストの実行、分解、コスト考慮型モデルルーティングによるエージェンティックエンジニアとしての運用
hage-oyaji/everything-claude-code-jp-local32026年3月29日 更新
AIエージェントが実装出力の大部分を生成するチームのためのエンジニアリング運用モデル
hage-oyaji/everything-claude-code-jp-local32026年3月29日 更新
AI支援開発のためのリグレッションテスト戦略。データベース依存なしのサンドボックスモードAPIテスト、自動バグチェックワークフロー、同一モデルがコードの作成とレビューを行う際のAIの盲点を検出するパターン。
hage-oyaji/everything-claude-code-jp-local32026年3月29日 更新
AndroidおよびKotlin Multiplatformプロジェクトのためのクリーンアーキテクチャパターン — モジュール構成、依存関係ルール、UseCase、Repository、データレイヤーパターン
hage-oyaji/everything-claude-code-jp-local32026年3月29日 更新