johnwilhite/laravel-flare-scrubber
Laravel service provider to scrub sensitive request data before reporting errors to Flare. Recursively sanitizes matching keys or values via exact keys, key regex, or value regex, with configurable replacement text (default SANITIZED).
Installation
composer require johnwilhite/laravel-flare-scrubber
Publish the config file (if not auto-generated):
php artisan vendor:publish --provider="JohnWilhite\LaravelFlareScrubber\FlareScrubberServiceProvider" --tag="config"
Configure Sensitive Data
Edit config/flare.php and define sensitive_data rules:
'sensitive_data' => [
'keys' => ['password', 'api_key'],
'key_regex' => ['/^secret_/'],
'value_regex' => ['/^\d{4}-\d{4}-\d{4}-\d{4}$/'], // Example: UUID scrubbing
],
First Use Case
Trigger an error (e.g., 1/0 in Tinker) and verify Flare reports scrubbed data. Check the Request Data tab in Flare for sanitized fields.
Dynamic Scrubbing Rules
Override config/flare.php per environment (e.g., config/flare-local.php for dev/staging).
// config/flare.php
'sensitive_data' => env('APP_ENV') === 'local'
? ['keys' => ['debug_token']]
: ['keys' => ['password']],
Conditional Scrubbing Use middleware to toggle scrubbing for specific routes:
// app/Http/Middleware/ScrubSensitiveData.php
public function handle($request, Closure $next) {
if ($request->is('admin/*')) {
config(['flare.sensitive_data.keys' => array_merge(
config('flare.sensitive_data.keys'),
['admin_token']
)]);
}
return $next($request);
}
Integration with Flare Events
Extend scrubbing logic via Flare’s flare.error event:
// app/Providers/EventServiceProvider.php
protected $listen = [
'flare.error' => [
\JohnWilhite\LaravelFlareScrubber\Events\ScrubRequestData::class,
],
];
request->input() with multi-level keys).key_regex for partial matches (e.g., ^/user/.*_token$) or value_regex for pattern-based scrubbing (e.g., credit card numbers).flare.php:
'sanitized_value' => '[REDACTED]',
Performance Overhead
flare.scrub_exclude in config:
'scrub_exclude' => ['/healthcheck', '/webhooks/stripe'],
False Positives
key_regex (e.g., /^pass/) may scrub legitimate keys like password_hash.preg_match('/^pass/', 'password_hash'); // Avoid!
Flare Native vs. Package
flare:config.Log Scrubbed Data: Add a temporary log to verify scrubbing:
// app/Providers/AppServiceProvider.php
public function boot() {
if (app()->environment('local')) {
\JohnWilhite\LaravelFlareScrubber\Scrubber::setDebug(true);
}
}
Check storage/logs/flare-scrubber.log for scrubbed keys/values.
Test Edge Cases:
// Test nested arrays
$request->merge([
'user' => [
'profile' => [
'ssn' => '123-45-6789',
'address' => ['city' => 'New York']
]
]
]);
Custom Scrubbers Register additional scrubbers via the service provider:
// app/Providers/FlareScrubberServiceProvider.php
public function register() {
$this->app->extend('flare.scrubber', function ($scrubber) {
$scrubber->addScrubber(function ($key, $value) {
return str_contains($value, 'supersecret') ? '[REDACTED]' : $value;
});
return $scrubber;
});
}
Dynamic Config Loading Load scrub rules from a database or API:
// config/flare.php
'sensitive_data' => [
'keys' => config('services.scrubber.keys', []),
],
Exclude Specific Values Whitelist safe values to avoid scrubbing:
'safe_values' => [
'password_hash' => ['starts_with' => 'bcrypt$']
],
How can I help you explore Laravel packages today?