114 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			PHP
		
	
		
		
			
		
	
	
			114 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			PHP
		
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								require_once dirname(__DIR__, 3) . '/app/helpers/security.php';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use PHPUnit\Framework\TestCase;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class SecurityHelperTest extends TestCase
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    private SecurityHelper $security;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    protected function setUp(): void
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        parent::setUp();
							 | 
						||
| 
								 | 
							
								        $this->security = SecurityHelper::getInstance();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testGenerateCsrfToken()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $token = $this->security->generateCsrfToken();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->assertNotEmpty($token);
							 | 
						||
| 
								 | 
							
								        $this->assertEquals(64, strlen($token)); // 32 bytes = 64 hex chars
							 | 
						||
| 
								 | 
							
								        $this->assertEquals($token, $_SESSION['csrf_token']);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testVerifyCsrfToken()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $token = $this->security->generateCsrfToken();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->assertTrue($this->security->verifyCsrfToken($token));
							 | 
						||
| 
								 | 
							
								        $this->assertFalse($this->security->verifyCsrfToken('invalid_token'));
							 | 
						||
| 
								 | 
							
								        $this->assertFalse($this->security->verifyCsrfToken(''));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testSanitizeString()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $input = '<script>alert("xss")</script>';
							 | 
						||
| 
								 | 
							
								        $expected = 'alert("xss")';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->assertEquals($expected, $this->security->sanitizeString($input));
							 | 
						||
| 
								 | 
							
								        $this->assertEquals('', $this->security->sanitizeString(null));
							 | 
						||
| 
								 | 
							
								        $this->assertEquals('', $this->security->sanitizeString([]));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testValidateEmail()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $this->assertTrue($this->security->validateEmail('test@example.com'));
							 | 
						||
| 
								 | 
							
								        $this->assertTrue($this->security->validateEmail('user.name+tag@example.co.uk'));
							 | 
						||
| 
								 | 
							
								        $this->assertFalse($this->security->validateEmail('invalid.email'));
							 | 
						||
| 
								 | 
							
								        $this->assertFalse($this->security->validateEmail('@example.com'));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testValidateInt()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $this->assertTrue($this->security->validateInt('123'));
							 | 
						||
| 
								 | 
							
								        $this->assertTrue($this->security->validateInt('-123'));
							 | 
						||
| 
								 | 
							
								        $this->assertFalse($this->security->validateInt('12.3'));
							 | 
						||
| 
								 | 
							
								        $this->assertFalse($this->security->validateInt('abc'));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testValidateUrl()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $this->assertTrue($this->security->validateUrl('https://example.com'));
							 | 
						||
| 
								 | 
							
								        $this->assertTrue($this->security->validateUrl('http://sub.example.co.uk/path?query=1'));
							 | 
						||
| 
								 | 
							
								        $this->assertTrue($this->security->validateUrl('ftp://example.com')); // Any valid URL is accepted
							 | 
						||
| 
								 | 
							
								        $this->assertFalse($this->security->validateUrl('not-a-url'));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testSanitizeArray()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $input = [
							 | 
						||
| 
								 | 
							
								            'name' => '<b>John</b>',
							 | 
						||
| 
								 | 
							
								            'email' => 'john@example.com',
							 | 
						||
| 
								 | 
							
								            'nested' => [
							 | 
						||
| 
								 | 
							
								                'key' => '<i>value</i>'
							 | 
						||
| 
								 | 
							
								            ]
							 | 
						||
| 
								 | 
							
								        ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $allowedKeys = ['name', 'email'];
							 | 
						||
| 
								 | 
							
								        $result = $this->security->sanitizeArray($input, $allowedKeys);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->assertArrayHasKey('name', $result);
							 | 
						||
| 
								 | 
							
								        $this->assertArrayHasKey('email', $result);
							 | 
						||
| 
								 | 
							
								        $this->assertArrayNotHasKey('nested', $result);
							 | 
						||
| 
								 | 
							
								        $this->assertEquals('John', $result['name']); // HTML tags are stripped
							 | 
						||
| 
								 | 
							
								        $this->assertEquals('john@example.com', $result['email']);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testValidateFormData()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $data = [
							 | 
						||
| 
								 | 
							
								            'name' => 'John Doe',
							 | 
						||
| 
								 | 
							
								            'email' => 'invalid-email',
							 | 
						||
| 
								 | 
							
								            'age' => 'not-a-number',
							 | 
						||
| 
								 | 
							
								            'website' => 'not-a-url'
							 | 
						||
| 
								 | 
							
								        ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $rules = [
							 | 
						||
| 
								 | 
							
								            'name' => ['type' => 'string', 'required' => true, 'min' => 2, 'max' => 50],
							 | 
						||
| 
								 | 
							
								            'email' => ['type' => 'email', 'required' => true],
							 | 
						||
| 
								 | 
							
								            'age' => ['type' => 'integer', 'required' => true],
							 | 
						||
| 
								 | 
							
								            'website' => ['type' => 'url', 'required' => true]
							 | 
						||
| 
								 | 
							
								        ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $errors = $this->security->validateFormData($data, $rules);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->assertIsArray($errors);
							 | 
						||
| 
								 | 
							
								        $this->assertCount(3, $errors);
							 | 
						||
| 
								 | 
							
								        $this->assertArrayHasKey('email', $errors);
							 | 
						||
| 
								 | 
							
								        $this->assertArrayHasKey('age', $errors);
							 | 
						||
| 
								 | 
							
								        $this->assertArrayHasKey('website', $errors);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |