|
6 | 6 |
|
7 | 7 | use KaririCode\ProcessorPipeline\ProcessorRegistry; |
8 | 8 | use KaririCode\Sanitizer\Attribute\Sanitize; |
9 | | -use KaririCode\Sanitizer\Processor\Cleaner\EmailAddressCleaner; |
10 | | -use KaririCode\Sanitizer\Processor\Cleaner\NumericValueCleaner; |
11 | | -use KaririCode\Sanitizer\Processor\HtmlPurifier; |
12 | | -use KaririCode\Sanitizer\Processor\Remover\WhitespaceRemover; |
13 | | -use KaririCode\Sanitizer\Processor\XssSanitizer; |
| 9 | +use KaririCode\Sanitizer\Processor\Domain\HtmlPurifierSanitizer; |
| 10 | +use KaririCode\Sanitizer\Processor\Domain\JsonSanitizer; |
| 11 | +use KaririCode\Sanitizer\Processor\Domain\MarkdownSanitizer; |
| 12 | +use KaririCode\Sanitizer\Processor\Input\HtmlSpecialCharsSanitizer; |
| 13 | +use KaririCode\Sanitizer\Processor\Input\NormalizeLineBreaksSanitizer; |
| 14 | +use KaririCode\Sanitizer\Processor\Input\StripTagsSanitizer; |
| 15 | +use KaririCode\Sanitizer\Processor\Input\TrimSanitizer; |
| 16 | +use KaririCode\Sanitizer\Processor\Security\FilenameSanitizer; |
| 17 | +use KaririCode\Sanitizer\Processor\Security\SqlInjectionSanitizer; |
| 18 | +use KaririCode\Sanitizer\Processor\Security\XssSanitizer; |
14 | 19 | use KaririCode\Sanitizer\Sanitizer; |
15 | 20 |
|
16 | | -class UserInput |
| 21 | +class UserProfile |
17 | 22 | { |
18 | | - #[Sanitize(sanitizers: ['trim', 'html_purifier', 'xss_sanitizer'])] |
| 23 | + #[Sanitize(sanitizers: ['trim', 'html_purifier', 'xss_sanitizer', 'html_special_chars'])] |
19 | 24 | private string $name = ''; |
20 | 25 |
|
21 | | - #[Sanitize(sanitizers: ['trim', 'email_cleaner'])] |
| 26 | + #[Sanitize(sanitizers: ['trim', 'normalize_line_breaks'])] |
22 | 27 | private string $email = ''; |
23 | 28 |
|
24 | | - #[Sanitize(sanitizers: ['trim', 'numeric_value_cleaner'])] |
| 29 | + #[Sanitize(sanitizers: ['trim', 'strip_tags'])] |
25 | 30 | private string $age = ''; |
26 | 31 |
|
27 | | - #[Sanitize(sanitizers: ['trim', 'html_purifier'], fallbackValue: 'No bio provided')] |
| 32 | + #[Sanitize(sanitizers: ['trim', 'html_purifier', 'markdown'], fallbackValue: 'No bio provided')] |
28 | 33 | private string $bio = ''; |
29 | 34 |
|
30 | | - // Getters and setters |
31 | 35 | public function getName(): string |
32 | 36 | { |
33 | 37 | return $this->name; |
@@ -69,36 +73,120 @@ public function setBio(string $bio): void |
69 | 73 | } |
70 | 74 | } |
71 | 75 |
|
72 | | -// Set up the ProcessorRegistry |
| 76 | +class UserPreferences |
| 77 | +{ |
| 78 | + #[Sanitize(sanitizers: ['json'])] |
| 79 | + private string $preferences = ''; |
| 80 | + |
| 81 | + public function getPreferences(): string |
| 82 | + { |
| 83 | + return $this->preferences; |
| 84 | + } |
| 85 | + |
| 86 | + public function setPreferences(string $preferences): void |
| 87 | + { |
| 88 | + $this->preferences = $preferences; |
| 89 | + } |
| 90 | +} |
| 91 | + |
| 92 | +class UserAvatar |
| 93 | +{ |
| 94 | + #[Sanitize(sanitizers: ['filename'])] |
| 95 | + private string $avatarFilename = ''; |
| 96 | + |
| 97 | + public function getAvatarFilename(): string |
| 98 | + { |
| 99 | + return $this->avatarFilename; |
| 100 | + } |
| 101 | + |
| 102 | + public function setAvatarFilename(string $avatarFilename): void |
| 103 | + { |
| 104 | + $this->avatarFilename = $avatarFilename; |
| 105 | + } |
| 106 | +} |
| 107 | + |
| 108 | +class UserSearch |
| 109 | +{ |
| 110 | + #[Sanitize(sanitizers: ['sql_injection'])] |
| 111 | + private string $searchQuery = ''; |
| 112 | + |
| 113 | + public function getSearchQuery(): string |
| 114 | + { |
| 115 | + return $this->searchQuery; |
| 116 | + } |
| 117 | + |
| 118 | + public function setSearchQuery(string $searchQuery): void |
| 119 | + { |
| 120 | + $this->searchQuery = $searchQuery; |
| 121 | + } |
| 122 | +} |
| 123 | + |
73 | 124 | $registry = new ProcessorRegistry(); |
74 | | -$registry->register('sanitizer', 'trim', new WhitespaceRemover()); |
75 | | -$registry->register('sanitizer', 'html_purifier', new HtmlPurifier()); |
76 | | -$registry->register('sanitizer', 'email_cleaner', new EmailAddressCleaner()); |
77 | | -$registry->register('sanitizer', 'numeric_value_cleaner', new NumericValueCleaner()); |
| 125 | +$registry->register('sanitizer', 'trim', new TrimSanitizer()); |
| 126 | +$registry->register('sanitizer', 'html_special_chars', new HtmlSpecialCharsSanitizer()); |
| 127 | +$registry->register('sanitizer', 'normalize_line_breaks', new NormalizeLineBreaksSanitizer()); |
| 128 | +$registry->register('sanitizer', 'strip_tags', new StripTagsSanitizer()); |
| 129 | +$registry->register('sanitizer', 'html_purifier', new HtmlPurifierSanitizer()); |
| 130 | +$registry->register('sanitizer', 'json', new JsonSanitizer()); |
| 131 | +$registry->register('sanitizer', 'markdown', new MarkdownSanitizer()); |
| 132 | +$registry->register('sanitizer', 'filename', new FilenameSanitizer()); |
| 133 | +$registry->register('sanitizer', 'sql_injection', new SqlInjectionSanitizer()); |
78 | 134 | $registry->register('sanitizer', 'xss_sanitizer', new XssSanitizer()); |
79 | 135 |
|
80 | 136 | $autoSanitizer = new Sanitizer($registry); |
81 | 137 |
|
82 | | -// Create a UserInput object with potentially unsafe data |
83 | | -$userInput = new UserInput(); |
84 | | -$userInput->setName(" John Doe <script>alert('xss')</script> "); |
85 | | -$userInput->setEmail(' john.doe@example#.com '); |
86 | | -$userInput->setAge(' 25 years old '); |
87 | | -$userInput->setBio("<p>Hello, I'm John!</p><script>alert('bio')</script>"); |
88 | | - |
89 | | -// Display original values |
90 | | -echo "Original values:\n"; |
91 | | -echo 'Name: ' . $userInput->getName() . "\n"; |
92 | | -echo 'Email: ' . $userInput->getEmail() . "\n"; |
93 | | -echo 'Age: ' . $userInput->getAge() . "\n"; |
94 | | -echo 'Bio: ' . $userInput->getBio() . "\n\n"; |
95 | | - |
96 | | -// Sanitize the user input |
97 | | -$autoSanitizer->sanitize($userInput); |
98 | | - |
99 | | -// Display sanitized values |
100 | | -echo "Sanitized values:\n"; |
101 | | -echo 'Name: ' . $userInput->getName() . "\n"; |
102 | | -echo 'Email: ' . $userInput->getEmail() . "\n"; |
103 | | -echo 'Age: ' . $userInput->getAge() . "\n"; |
104 | | -echo 'Bio: ' . $userInput->getBio() . "\n"; |
| 138 | +// Create input objects with potentially unsafe data |
| 139 | +$userProfile = new UserProfile(); |
| 140 | +$userProfile->setName(" Walmir Silva <script>alert('xss')</script> "); |
| 141 | +$userProfile->setEmail(" walmir.silva@example.com \r\n"); |
| 142 | +$userProfile->setAge(' <b>35</b> '); |
| 143 | +$userProfile->setBio("# Hello\n\n<p>I'm Walmir!</p><script>alert('bio')</script>"); |
| 144 | + |
| 145 | +$userPreferences = new UserPreferences(); |
| 146 | +$userPreferences->setPreferences('{"theme": "dark", "notifications": true}'); |
| 147 | + |
| 148 | +$userAvatar = new UserAvatar(); |
| 149 | +$userAvatar->setAvatarFilename('my avatar!.jpg'); |
| 150 | + |
| 151 | +$userSearch = new UserSearch(); |
| 152 | +$userSearch->setSearchQuery("users'; DROP TABLE users; --"); |
| 153 | + |
| 154 | +// Function to display original and sanitized values |
| 155 | + |
| 156 | +function displayValues($object, $sanitizer) |
| 157 | +{ |
| 158 | + echo "Original values:\n"; |
| 159 | + $reflection = new ReflectionClass($object); |
| 160 | + foreach ($reflection->getProperties() as $property) { |
| 161 | + $propertyName = $property->getName(); |
| 162 | + $getter = 'get' . ucfirst($propertyName); |
| 163 | + if (method_exists($object, $getter)) { |
| 164 | + echo ucfirst($propertyName) . ': "' . str_replace("\n", '\n', $object->$getter()) . "\"\n"; |
| 165 | + } |
| 166 | + } |
| 167 | + |
| 168 | + $sanitizer->sanitize($object); |
| 169 | + |
| 170 | + echo "\nSanitized values:\n"; |
| 171 | + foreach ($reflection->getProperties() as $property) { |
| 172 | + $propertyName = $property->getName(); |
| 173 | + $getter = 'get' . ucfirst($propertyName); |
| 174 | + if (method_exists($object, $getter)) { |
| 175 | + echo ucfirst($propertyName) . ': "' . str_replace("\n", '\n', $object->$getter()) . "\"\n"; |
| 176 | + } |
| 177 | + } |
| 178 | + echo "\n"; |
| 179 | +} |
| 180 | + |
| 181 | +// Display and sanitize values for each object |
| 182 | +echo "User Profile:\n"; |
| 183 | +displayValues($userProfile, $autoSanitizer); |
| 184 | + |
| 185 | +echo "User Preferences:\n"; |
| 186 | +displayValues($userPreferences, $autoSanitizer); |
| 187 | + |
| 188 | +echo "User Avatar:\n"; |
| 189 | +displayValues($userAvatar, $autoSanitizer); |
| 190 | + |
| 191 | +echo "User Search:\n"; |
| 192 | +displayValues($userSearch, $autoSanitizer); |
0 commit comments