Installation
composer require artflow-studio/laravel-security
php artisan vendor:publish --provider="ArtflowStudio\Security\SecurityServiceProvider" --tag="security-config"
First Scan
php artisan security:scan
Quick Wins
php artisan security:fix --dry-run
php artisan security:scan --format=html --output=report.html
config/security.php (adjust scanner thresholds, exclusions, or auto-fix rules).php artisan security:scan --help (lists all scanners and options).php artisan security:scan --scanner=livewire to target Livewire-specific issues.Pre-Commit Hook
Add to .git/hooks/pre-commit (or use Laravel Forge/Envoyer):
#!/bin/bash
php artisan security:scan --severity=critical --format=json | jq -e '.findings | length > 0' && exit 1 || exit 0
CI/CD Pipeline
# Example GitHub Actions step
- name: Security Scan
run: |
php artisan security:scan --format=json --output=scan-results.json
# Upload artifact or fail build if critical issues exist
Livewire Development Loop
php artisan security:scan --scanner=livewire --path=app/Http/Livewire
--auto-fix for safe fixes (e.g., missing useForm in Livewire components):
php artisan security:fix --scanner=livewire --dry-run
// config/security.php
'excludes' => [
'vendor/**',
'storage/**',
'tests/**',
],
php artisan security:scan --severity=high,critical
# Scan only for SQL injection risks
php artisan security:scan --scanner=sql
# Scan only Livewire components
php artisan security:scan --scanner=livewire
php artisan security:scan --format=email --to=security-team@example.com
// In SecurityServiceProvider
$this->app->booting(function () {
if (config('security.track_in_telescope')) {
\ArtflowStudio\Security\Telescope\SecurityScan::observe(\ArtflowStudio\Security\Models\Scan::class);
}
});
use ArtflowStudio\Security\Tests\LivewireSecurityTestCase;
public function test_livewire_component_security()
{
$this->scanLivewireComponent(MyComponent::class)
->assertNoVulnerabilities();
}
False Positives
{{ $user->name }} in Blade) as XSS risks.excludes in config or whitelist patterns:
'whitelists' => [
'Blade' => [
'/\{\{\s*\$user->[a-zA-Z0-9_]+\s*\}\}/' => 'Safe user property access',
],
],
Performance Overhead
php artisan security:scan --parallel
storage/framework/views).Auto-Fix Limitations
useForm to a Livewire component with existing state).--dry-run first and review changes:
php artisan security:fix --scanner=livewire --dry-run --diff
Livewire 3 Quirks
public properties in Livewire as security risks.'livewire' => [
'ignore_public_properties' => ['id', 'createdAt'], // Whitelist safe properties
],
php artisan security:scan --verbose
php artisan security:scan --path=app/Http/Controllers/AuthController.php
ArtflowStudio\Security\Scanners namespace for custom rules or overrides.Custom Scanners
Create a new scanner by extending ArtflowStudio\Security\Contracts\Scanner:
namespace App\Security\Scanners;
use ArtflowStudio\Security\Contracts\Scanner;
use ArtflowStudio\Security\Severity;
class CustomScanner implements Scanner
{
public function scan(string $path): array
{
return [
new Finding(
path: $path,
description: 'Custom security rule violated',
severity: Severity::High,
fix: 'Apply custom fix...'
),
];
}
}
Register it in config/security.php:
'scanners' => [
// ...
App\Security\Scanners\CustomScanner::class,
],
Override Findings
Extend the Finding class to add custom metadata:
namespace App\Security;
use ArtflowStudio\Security\Finding as BaseFinding;
class Finding extends BaseFinding
{
public function __construct(array $data)
{
parent::__construct($data);
$this->metadata['custom'] = 'value';
}
}
Hook into Fixes
Override the Fix class to add pre/post-fix logic:
namespace App\Security\Fixes;
use ArtflowStudio\Security\Fix as BaseFix;
class CustomFix extends BaseFix
{
public function apply(): bool
{
// Custom logic before applying fix
$result = parent::apply();
// Custom logic after applying fix
return $result;
}
}
config/security.php maps severities correctly to your team’s workflow (e.g., Critical = P0, High = P1)./) in excludes/includes even on Windows (Laravel normalizes paths).--max-runtime flag to avoid long-running scans:
php artisan security:scan --max-runtime=300
phpstan, psalm, and laravel-shift for layered security.--format=markdown output.php artisan security:fix --scanner=sql --auto-commit
php artisan security:history --since=1month
How can I help you explore Laravel packages today?