artisanpack-ui/security
Core Laravel security toolkit for ArtisanPack UI: sanitization, escaping (Laminas Escaper), KSES filtering, validation rules, security/CSP middleware, CSP builder with nonce & reporting, rate limiting, audit/scan commands, and testing helpers.
Installation:
composer require artisanpack-ui/security
php artisan vendor:publish --tag=security-config
First Use Case: Sanitize user input and escape output in a form handler:
use ArtisanPackUI\Security\Facades\Security;
$cleanName = Security::sanitizeText(request('name'));
echo Security::escHtml($cleanName);
Or use global helpers:
$cleanName = sanitizeText(request('name'));
echo escHtml($cleanName);
Middleware Setup: Apply security middleware to routes:
Route::middleware(['security.headers', 'xss.protection'])->group(function () {
// Your routes here
});
CSP Nonces in Blade:
<script @csp_nonce>
// Your JS here
</script>
docs/api-reference.md for all available functionsdocs/security-guidelines.md for best practicesphp artisan to see available security commands// In a controller or form request
$input = [
'name' => request('name'),
'email' => request('email'),
'bio' => request('bio')
];
$cleanInput = Security::sanitizeArray($input);
// or use individual sanitizers
$cleanInput = [
'name' => sanitizeText(request('name')),
'email' => sanitizeEmail(request('email')),
'bio' => kses(request('bio'), ['p', 'br', 'strong', 'em'])
];
// Blade template
<p>{{ escHtml($userComment) }}</p>
<a href="{{ escUrl($userLink) }}">{{ escAttr($userLink) }}</a>
<script>
const data = {{ escJs($jsonData) }};
</script>
// In routes/web.php
Route::middleware(['csp'])->group(function () {
// Your routes
});
// Generate nonces in Blade
<button @csp_nonce>Click Me</button>
// Test CSP with Artisan
php artisan csp:test
// In routes/api.php
Route::middleware(['api.rate_limit:api'])->group(function () {
// Your API routes
});
// Custom rate limit in middleware
Security::rateLimit('custom', function ($request) {
return $request->ip();
});
# Run comprehensive security scan
php artisan security:audit
# Check current security headers
php artisan security:test-headers
# Benchmark performance impact
php artisan security:benchmark
Form Request Validation:
use ArtisanPackUI\Security\Rules\NoHtml;
public function rules()
{
return [
'bio' => ['required', new NoHtml],
'website' => ['nullable', 'url', new SecureUrl]
];
}
Livewire Component Security:
use ArtisanPackUI\Security\Facades\Security;
public function mount()
{
$this->safeContent = Security::kses($this->inputContent, ['p', 'strong']);
}
API Security Layer:
Route::middleware(['api.security', 'api.rate_limit:api'])->group(function () {
// Your secure API endpoints
});
Custom Sanitization Rules:
Security::extendSanitizer('custom', function ($value) {
// Your custom logic
return $value;
});
// Usage
Security::sanitize('custom', $value);
CSP Policy Customization:
// In config/security.php
'csp' => [
'default-src' => ["'self'"],
'script-src' => ["'self'", "'unsafe-inline'", "@csp_nonce"],
'style-src' => ["'self'", "'unsafe-inline'", "@csp_nonce"],
'img-src' => ["'self'", 'data:'],
'connect-src' => ["'self'"],
'font-src' => ["'self'"],
'object-src' => ["'none'"],
'base-uri' => ["'self'"],
'form-action' => ["'self'"],
],
Double Escaping:
escHtml(escHtml($var)))CSP Over-Restriction:
csp:test command to identify blocked resources:
php artisan csp:test --verbose
Nonce Management:
@csp_nonce directive in dynamic contentBlade::directive('csp', function ($expression) {
return "<?php echo Security::generateNonce(); ?>";
});
Rate Limit Configuration:
'rate_limits' => [
'api' => [
'max' => 60, // requests
'per' => 'minute',
'key' => function ($request) {
return $request->ip();
}
]
]
KSES Configuration:
kses($html, ['p' => ['class' => true, 'id' => true]])
Security Headers:
curl -I https://yourdomain.com
Content-Security-PolicyX-Content-Type-Options: nosniffX-Frame-Options: DENYX-XSS-Protection: 1; mode=blockCSP Violations:
/csp-violations endpointcsp:stats command:
php artisan csp:stats
Sanitization Issues:
dd(Security::sanitizeArray($input));
Performance Impact:
php artisan security:benchmark
CSP Reporting Endpoint:
csp_violation_reports table (migration runs automatically)'csp' => [
'report_uri' => null,
]
Middleware Order:
security.headers runs before other middleware that might modify headerssecurity.headersxss.protectioncspCache Dependencies:
php artisan cache:clear
Livewire Integration:
livewire/livewire)Custom Sanitizers:
Security::extendSanitizer('custom', function ($value, $options = []) {
// Your sanitization logic
return $sanitizedValue;
});
// Usage
Security::sanitize('custom', $value);
Custom Validation Rules:
use ArtisanPackUI\Security\Rules;
class CustomRule extends Rules\BaseRule {
public function passes($attribute, $value) {
// Your validation logic
return true;
}
}
// Usage in Form Request
$this->rules = [
'field' => ['required', new CustomRule]
];
Custom CSP Directives:
Security::extendCspDirective('custom-directive', function ($value) {
return "custom-src $value";
});
// Usage in config
'csp' => [
'custom-directive' => ["'self'
How can I help you explore Laravel packages today?