Skip to content

Commit 7c081ea

Browse files
committed
feat(application): add search and plain text fields
- Add `searchQuery` and `plainTextContent` fields to the `JobApplication` class - Implement getter/setter methods for the new fields - Update `displayResults` function to show the new fields - Add data examples to test the new sanitizers
1 parent 31d2689 commit 7c081ea

File tree

2 files changed

+136
-80
lines changed

2 files changed

+136
-80
lines changed

src/Processor/Security/SqlInjectionSanitizer.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
final class SqlInjectionSanitizer extends AbstractSanitizerProcessor implements ConfigurableProcessor
1111
{
12-
private const SQL_DETECTION_PATTERN = '/\b(SELECT|INSERT|UPDATE|DELETE|UNION|DROP|TRUNCATE|ALTER)\s.+\s(FROM|INTO|TABLE)\b/i';
12+
// private const SQL_DETECTION_PATTERN = '/\b(SELECT|INSERT|UPDATE|DELETE|UNION|DROP|TRUNCATE|ALTER)\s.+\s(FROM|INTO|TABLE)\b/i';
1313
private const SUSPICIOUS_PATTERNS = [
1414
'/--.*$/m' => '', // Remove single-line comments
1515
'/\/\*.*?\*\//s' => '', // Remove multi-line comments

tests/application.php

Lines changed: 135 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@
1515
use KaririCode\Sanitizer\Processor\Input\NormalizeLineBreaksSanitizer;
1616
use KaririCode\Sanitizer\Processor\Input\NumericSanitizer;
1717
use KaririCode\Sanitizer\Processor\Input\PhoneSanitizer;
18+
use KaririCode\Sanitizer\Processor\Input\StripTagsSanitizer;
1819
use KaririCode\Sanitizer\Processor\Input\TrimSanitizer;
1920
use KaririCode\Sanitizer\Processor\Input\UrlSanitizer;
2021
use KaririCode\Sanitizer\Processor\Security\FilenameSanitizer;
22+
use KaririCode\Sanitizer\Processor\Security\SqlInjectionSanitizer;
2123
use KaririCode\Sanitizer\Processor\Security\XssSanitizer;
2224
use KaririCode\Sanitizer\Sanitizer;
2325

@@ -139,6 +141,30 @@ class JobApplication
139141
)]
140142
private string $projectsJson = '';
141143

144+
#[Sanitize(
145+
processors: [
146+
'trim',
147+
'sql_injection' => [
148+
'escapeMap' => [
149+
"'" => "\\'",
150+
'"' => '\\"',
151+
],
152+
],
153+
]
154+
)]
155+
private string $searchQuery = '';
156+
157+
#[Sanitize(
158+
processors: [
159+
'trim',
160+
'strip_tags' => [
161+
'allowedTags' => ['p', 'br'],
162+
'keepSafeAttributes' => true,
163+
],
164+
]
165+
)]
166+
private string $plainTextContent = '';
167+
142168
// Getters and Setters
143169
public function getFullName(): string
144170
{
@@ -259,6 +285,30 @@ public function setProjectsJson(string $value): self
259285

260286
return $this;
261287
}
288+
289+
public function getSearchQuery(): string
290+
{
291+
return $this->searchQuery;
292+
}
293+
294+
public function setSearchQuery(string $value): self
295+
{
296+
$this->searchQuery = $value;
297+
298+
return $this;
299+
}
300+
301+
public function getPlainTextContent(): string
302+
{
303+
return $this->plainTextContent;
304+
}
305+
306+
public function setPlainTextContent(string $value): self
307+
{
308+
$this->plainTextContent = $value;
309+
310+
return $this;
311+
}
262312
}
263313

264314
// Create and configure the registry
@@ -278,83 +328,89 @@ public function setProjectsJson(string $value): self
278328
$registry->register('sanitizer', 'filename_sanitizer', new FilenameSanitizer());
279329
$registry->register('sanitizer', 'json_sanitizer', new JsonSanitizer());
280330
$registry->register('sanitizer', 'xss_sanitizer', new XssSanitizer());
331+
$registry->register('sanitizer', 'sql_injection', new SqlInjectionSanitizer());
332+
$registry->register('sanitizer', 'strip_tags', new StripTagsSanitizer());
333+
334+
// Create the sanitizer
335+
$sanitizer = new Sanitizer($registry);
336+
337+
// Create an application with potentially dangerous data
338+
$application = new JobApplication();
339+
$application
340+
->setFullName(" Walmir Silva <script>alert('xss')</script> ")
341+
->setEmail(" walmir.silva@gmail.con \n")
342+
->setPhone('11987654321')
343+
->setProfessionalSummary("
344+
<h2>Professional Summary</h2>
345+
346+
<p>I am a senior developer with experience in:</p>
347+
348+
<ul>
349+
<li>PHP Development</li>
350+
<li>Database Design</li>
351+
<li>System Architecture</li>
352+
</ul>
353+
354+
<p>Visit my website: <a href='https://example.com'>My Portfolio</a></p>
355+
")
356+
->setYearsOfExperience('10')
357+
->setPortfolioUrl('example.com/portfolio')
358+
->setGithubHandle('@walmir-silva')
359+
->setLinkedinHandle('Walmir-Silva')
360+
->setResumeFileName('Walmir Silva Resume (2024).pdf')
361+
->setProjectsJson('{
362+
"projects": [
363+
{
364+
"name": "E-commerce Platform",
365+
"role": "Lead Developer",
366+
"duration": "2 years"
367+
}
368+
]
369+
}')
370+
->setProjectsJson('{
371+
"projects": [
372+
{
373+
"name": "E-commerce Platform",
374+
"role": "Lead Developer",
375+
"duration": "2 years"
376+
}
377+
]
378+
}')
379+
->setSearchQuery("SELECT * FROM users'; DROP TABLE users; --")
380+
->setPlainTextContent('<p>Este é um texto com algumas <b>tags</b> HTML que precisam ser tratadas</p>');
381+
382+
// Function to display the results
383+
384+
function displayResults(JobApplication $application, array $result): void
385+
{
386+
echo "Job Application Sanitization Results:\n";
387+
echo "=====================================\n\n";
388+
389+
echo "Sanitized Values:\n";
390+
echo "----------------\n";
391+
392+
// Display all sanitized values with clear formatting
393+
echo sprintf("Full Name: %s\n", $application->getFullName());
394+
echo sprintf("Email: %s\n", $application->getEmail());
395+
echo sprintf("Phone: %s\n", $application->getPhone());
396+
echo sprintf("Years of Experience: %s\n", $application->getYearsOfExperience());
397+
echo sprintf("Portfolio URL: %s\n", $application->getPortfolioUrl());
398+
echo sprintf("GitHub Handle: %s\n", $application->getGithubHandle());
399+
echo sprintf("LinkedIn Handle: %s\n", $application->getLinkedinHandle());
400+
echo sprintf("Resume Filename: %s\n", $application->getResumeFileName());
401+
// Adicionar os novos campos aqui
402+
echo sprintf("Search Query: %s\n", $application->getSearchQuery());
403+
echo sprintf("Plain Text Content: %s\n", $application->getPlainTextContent());
404+
405+
echo "\nProfessional Summary:\n";
406+
echo "-------------------\n";
407+
echo $application->getProfessionalSummary() . "\n\n";
408+
409+
echo "Projects JSON:\n";
410+
echo "-------------\n";
411+
echo $application->getProjectsJson() . "\n";
412+
}
281413

282-
$sanitizer = new FilenameSanitizer();
283-
$sanitizer->configure([
284-
'maxLength' => 100,
285-
'toLowerCase' => true,
286-
'allowedExtensions' => ['jpg', 'png', 'pdf'],
287-
'blockDangerousExtensions' => true,
288-
]);
289-
290-
echo $sanitizer->process('My File Name.php') . "\n"; // Retorna "my_file_name"
291-
echo $sanitizer->process('Document.PDF'); // Retorna "document.pdf"
292-
293-
// // Create the sanitizer
294-
// $sanitizer = new Sanitizer($registry);
295-
296-
// // Create an application with potentially dangerous data
297-
// $application = new JobApplication();
298-
// $application
299-
// ->setFullName(" Walmir Silva <script>alert('xss')</script> ")
300-
// ->setEmail(" walmir.silva@gmail.con \n")
301-
// ->setPhone("11987654321")
302-
// ->setProfessionalSummary("
303-
// <h2>Professional Summary</h2>
304-
305-
// <p>I am a senior developer with experience in:</p>
306-
307-
// <ul>
308-
// <li>PHP Development</li>
309-
// <li>Database Design</li>
310-
// <li>System Architecture</li>
311-
// </ul>
312-
313-
// <p>Visit my website: <a href='https://example.com'>My Portfolio</a></p>
314-
// ")
315-
// ->setYearsOfExperience("10")
316-
// ->setPortfolioUrl("example.com/portfolio")
317-
// ->setGithubHandle("@walmir-silva")
318-
// ->setLinkedinHandle("Walmir-Silva")
319-
// ->setResumeFileName("Walmir Silva Resume (2024).pdf")
320-
// ->setProjectsJson('{
321-
// "projects": [
322-
// {
323-
// "name": "E-commerce Platform",
324-
// "role": "Lead Developer",
325-
// "duration": "2 years"
326-
// }
327-
// ]
328-
// }');
329-
330-
// // Function to display the results
331-
// function displayResults(JobApplication $application, array $result): void
332-
// {
333-
// echo "Job Application Sanitization Results:\n";
334-
// echo "=====================================\n\n";
335-
336-
// echo "Sanitized Values:\n";
337-
// echo "----------------\n";
338-
339-
// // Display all sanitized values with clear formatting
340-
// echo sprintf("Full Name: %s\n", $application->getFullName());
341-
// echo sprintf("Email: %s\n", $application->getEmail());
342-
// echo sprintf("Phone: %s\n", $application->getPhone());
343-
// echo sprintf("Years of Experience: %s\n", $application->getYearsOfExperience());
344-
// echo sprintf("Portfolio URL: %s\n", $application->getPortfolioUrl());
345-
// echo sprintf("GitHub Handle: %s\n", $application->getGithubHandle());
346-
// echo sprintf("LinkedIn Handle: %s\n", $application->getLinkedinHandle());
347-
// echo sprintf("Resume Filename: %s\n", $application->getResumeFileName());
348-
349-
// echo "\nProfessional Summary:\n";
350-
// echo "-------------------\n";
351-
// echo $application->getProfessionalSummary() . "\n\n";
352-
353-
// echo "Projects JSON:\n";
354-
// echo "-------------\n";
355-
// echo $application->getProjectsJson() . "\n";
356-
// }
357-
358-
// // Sanitize the application and display results
359-
// $result = $sanitizer->sanitize($application);
360-
// displayResults($application, $result->toArray());
414+
// Sanitize the application and display results
415+
$result = $sanitizer->sanitize($application);
416+
displayResults($application, $result->toArray());

0 commit comments

Comments
 (0)