PHP code example of kirschbaum-development / redactor
1. Go to this page and download the library: Download kirschbaum-development/redactor library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
kirschbaum-development / redactor example snippets
use Kirschbaum\Redactor\Facades\Redactor;
// Basic usage
$data = [
'user_id' => 123,
'password' => 'secret123',
'api_key' => 'sk-1234567890abcdef1234567890abcdef12345678',
'email' => '[email protected] '
];
$redacted = Redactor::redact($data);
// Result:
// [
// 'user_id' => 123, // Safe key - preserved
// 'password' => '[REDACTED]', // Blocked key - redacted
// 'api_key' => '[REDACTED]', // High entropy - redacted
// 'email' => '[REDACTED]', // Email pattern - redacted
// '_redacted' => true // Metadata added
// ]
// Use built-in profiles
$logData = Redactor::redact($data, 'default'); // Balanced redaction
$auditData = Redactor::redact($data, 'strict'); // Aggressive redaction
$debugData = Redactor::redact($data, 'performance'); // Minimal redaction for speed
return [
'default_profile' => 'default',
'profiles' => [
'default' => [
'enabled' => true,
// Strategies executed in array order (top-to-bottom priority)
'strategies' => [
\Kirschbaum\Redactor\Strategies\SafeKeysStrategy::class,
\Kirschbaum\Redactor\Strategies\BlockedKeysStrategy::class,
\Kirschbaum\Redactor\Strategies\LargeObjectStrategy::class,
\Kirschbaum\Redactor\Strategies\LargeStringStrategy::class,
\Kirschbaum\Redactor\Strategies\RegexPatternsStrategy::class,
\Kirschbaum\Redactor\Strategies\ShannonEntropyStrategy::class,
],
'safe_keys' => ['id', 'user_id', 'uuid', 'created_at', 'updated_at'],
'blocked_keys' => ['password', 'secret', 'token', 'api_key', 'authorization'],
'patterns' => [
'email' => '/[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+/',
'credit_card' => '/\b(?:\d[ -]*?){13,16}\b/',
'ssn' => '/\b\d{3}-?\d{2}-?\d{4}\b/',
'phone_simple' => '/\b\d{3}[.-]?\d{3}[.-]?\d{4}\b/',
'url_with_auth' => '/https?:\/\/[^:\/\s]+:[^@\/\s]+@[^\s]+/',
],
'replacement' => '[REDACTED]',
'mark_redacted' => true,
'track_redacted_keys' => false,
'non_redactable_object_behavior' => 'preserve', // 'preserve', 'remove', 'redact', 'empty_array'
'max_value_length' => 5000,
'redact_large_objects' => true,
'max_object_size' => 100,
'shannon_entropy' => [
'enabled' => true,
'threshold' => 4.8, // Higher = more selective
'min_length' => 25, // Only analyze strings this long or longer
'exclusion_patterns' => [
'/^https?:\/\//', // URLs
'/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i', // UUIDs
'/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/', // IP addresses
'/^[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}$/i', // MAC addresses
],
],
],
],
];
// config/redactor.php
'profiles' => [
'wildcard_example' => [
'enabled' => true,
'strategies' => [
\Kirschbaum\Redactor\Strategies\BlockedKeysStrategy::class,
],
'blocked_keys' => [
'*token*', // Matches any key containing "token"
'*key*', // Matches any key containing "key"
'password', // Exact match (no wildcards)
'user_*_data', // Matches keys like "user_profile_data", "user_settings_data"
],
// ... other config
],
];
// Usage example
$data = [
'user_id' => 123,
'api_token' => 'secret123', // Matched by *token*
'access_token' => 'abc123', // Matched by *token*
'my_custom_token' => 'xyz789', // Matched by *token*
'user_api_key' => 'key123', // Matched by *key*
'private_key_data' => 'private', // Matched by *key*
'password' => 'secret', // Matched by exact "password"
'user_profile_data' => 'profile', // Matched by user_*_data
'user_settings_data' => 'settings', // Matched by user_*_data
'normal_field' => 'safe_value', // Not matched - preserved
];
$redacted = Redactor::redact($data, 'wildcard_example');
'blocked_keys' => ['*token*', '*secret*', '*auth*'],
// Matches:
// - api_token, access_token, token_data, my_token_field
// - user_secret, secret_key, app_secret_config
// - auth_header, oauth_token, authentication_data
'blocked_keys' => ['password*', 'secret*', 'api*'],
// Matches:
// - password, password_hash, password_confirmation
// - secret, secret_key, secret_data
// - api, api_key, api_token, api_endpoint
'blocked_keys' => ['*token', '*key', '*secret'],
// Matches:
// - access_token, api_token, user_token
// - private_key, public_key, encryption_key
// - user_secret, app_secret, database_secret
'blocked_keys' => [
'user_*_token', // user_api_token, user_auth_token
'app_*_*_key', // app_private_encryption_key, app_public_signing_key
'*_key_*', // my_key_data, the_key_value, user_key_config
],
'blocked_keys' => ['*TOKEN*'],
// Matches all of these:
// - API_TOKEN, api_token, Api_Token, MyTokenData, user_token_field
'blocked_keys' => [
'password', // Exact match
'secret', // Exact match
'*token*', // Wildcard pattern
'*_key_*', // Complex wildcard
'user_*_data', // Specific structure
],
'safe_keys' => [
'id', // Exact match - always preserved
'user_id', // Exact match - always preserved
'*_count', // Wildcard pattern - preserve counting fields
'meta_*', // Wildcard pattern - preserve metadata fields
],
use Kirschbaum\Redactor\Facades\Redactor;
// Before logging user actions
Log::info('User action', Redactor::redact([
'user_id' => 123,
'action' => 'login',
'ip_address' => '192.168.1.1',
'session_token' => 'abc123def456...',
'user_agent' => 'Mozilla/5.0...',
'api_response' => $sensitiveApiData,
]));
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => explode(',', env('LOG_STACK', 'single')),
'ignore_exceptions' => false,
'tap' => [Kirschbaum\Redactor\Logging\CustomLogTap::class],
],
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'tap' => [Kirschbaum\Redactor\Logging\CustomLogTap::class],
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'days' => 14,
'tap' => [Kirschbaum\Redactor\Logging\CustomLogTap::class],
],
],
use Kirschbaum\Redactor\Facades\Redactor;
// Before returning debug information
return response()->json([
'debug' => Redactor::redact($requestData, 'performance'),
'status' => 'processed'
]);
use Kirschbaum\Redactor\Facades\Redactor;
// Before exporting user data
$users = User::all()->map(function ($user) {
return Redactor::redact($user->toArray(), 'strict');
});
// Audit trail with sensitive data redacted
$auditLog = Redactor::redact([
'user_id' => $user->id,
'changes' => $changes,
'request_data' => request()->all(),
], 'audit');
// config/redactor.php
'profiles' => [
'pci_compliant' => [
'enabled' => true,
'strategies' => [
\Kirschbaum\Redactor\Strategies\SafeKeysStrategy::class,
\Kirschbaum\Redactor\Strategies\BlockedKeysStrategy::class,
\Kirschbaum\Redactor\Strategies\RegexPatternsStrategy::class,
],
'safe_keys' => ['order_id', 'customer_id', 'amount', 'currency'],
'blocked_keys' => [
'credit_card', 'cc_number', 'card_number', 'pan',
'cvv', 'cvc', 'cvn', 'expiry', 'exp_date', 'security_code'
],
'patterns' => [
'credit_card' => '/\b(?:\d[ -]*?){13,16}\b/',
'ssn' => '/\b\d{3}-?\d{2}-?\d{4}\b/',
'routing_number' => '/\b\d{9}\b/',
],
'replacement' => '[PCI_REDACTED]',
'non_redactable_object_behavior' => 'redact',
],
];
// Usage
$orderData = Redactor::redact($order->toArray(), 'pci_compliant');
use Kirschbaum\Redactor\Facades\Redactor;
// Laravel models (uses toArray())
$user = User::find(1);
$redacted = Redactor::redact($user);
// Plain objects (uses JSON serialization)
$object = new stdClass();
$object->secret = 'sensitive';
$redacted = Redactor::redact($object);
// Non-serializable objects (configurable behavior)
$resource = fopen('file.txt', 'r');
$redacted = Redactor::redact(['file' => $resource]);
// Behavior controlled by 'non_redactable_object_behavior' setting
use Kirschbaum\Redactor\Strategies\RedactionStrategyInterface;
use Kirschbaum\Redactor\RedactionContext;
class InternalDataStrategy implements RedactionStrategyInterface
{
public function shouldHandle(mixed $value, string $key, RedactionContext $context): bool
{
return str_contains($key, 'internal_') || str_contains($key, 'debug_');
}
public function handle(mixed $value, string $key, RedactionContext $context): mixed
{
$context->markRedacted();
return '[INTERNAL]';
}
}
// Register and use
use Kirschbaum\Redactor\Facades\Redactor;
Redactor::registerCustomStrategy('internal_data', new InternalDataStrategy());
// Add to profile configuration
'strategies' => [
'internal_data', // Custom strategy by registered name
\Kirschbaum\Redactor\Strategies\SafeKeysStrategy::class,
// ... other strategies
],
// Via Facade (recommended)
use Kirschbaum\Redactor\Facades\Redactor;
$result = Redactor::redact($data, 'profile_name');
// Via Service Container
$redactor = app(\Kirschbaum\Redactor\Redactor::class);
$result = $redactor->redact($data, 'profile_name');
// Direct Instantiation (gets fresh instance - no state conflicts)
$redactor = new \Kirschbaum\Redactor\Redactor();
$result = $redactor->redact($data, 'profile_name');
// Check available profiles
$profiles = Redactor::getAvailableProfiles();
$exists = Redactor::profileExists('custom_profile');