Skip to content

Commit c10474a

Browse files
committed
feat(sanitizer): implement comprehensive sanitizer test suite
- Add UserProfile, UserPreferences, UserAvatar, and UserSearch classes - Implement various sanitizer processors for different data types - Create displayValues function for showing original and sanitized data - Set up ProcessorRegistry with all available sanitizers - Demonstrate sanitization on potentially unsafe input data
1 parent e80dd99 commit c10474a

File tree

1 file changed

+127
-39
lines changed

1 file changed

+127
-39
lines changed

tests/application.php

Lines changed: 127 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,32 @@
66

77
use KaririCode\ProcessorPipeline\ProcessorRegistry;
88
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;
1419
use KaririCode\Sanitizer\Sanitizer;
1520

16-
class UserInput
21+
class UserProfile
1722
{
18-
#[Sanitize(sanitizers: ['trim', 'html_purifier', 'xss_sanitizer'])]
23+
#[Sanitize(sanitizers: ['trim', 'html_purifier', 'xss_sanitizer', 'html_special_chars'])]
1924
private string $name = '';
2025

21-
#[Sanitize(sanitizers: ['trim', 'email_cleaner'])]
26+
#[Sanitize(sanitizers: ['trim', 'normalize_line_breaks'])]
2227
private string $email = '';
2328

24-
#[Sanitize(sanitizers: ['trim', 'numeric_value_cleaner'])]
29+
#[Sanitize(sanitizers: ['trim', 'strip_tags'])]
2530
private string $age = '';
2631

27-
#[Sanitize(sanitizers: ['trim', 'html_purifier'], fallbackValue: 'No bio provided')]
32+
#[Sanitize(sanitizers: ['trim', 'html_purifier', 'markdown'], fallbackValue: 'No bio provided')]
2833
private string $bio = '';
2934

30-
// Getters and setters
3135
public function getName(): string
3236
{
3337
return $this->name;
@@ -69,36 +73,120 @@ public function setBio(string $bio): void
6973
}
7074
}
7175

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+
73124
$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());
78134
$registry->register('sanitizer', 'xss_sanitizer', new XssSanitizer());
79135

80136
$autoSanitizer = new Sanitizer($registry);
81137

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

Comments
 (0)