diff --git a/src/Traits/RandomStringTrait.php b/src/Traits/RandomStringTrait.php index 3b5db6d1..4a351cef 100644 --- a/src/Traits/RandomStringTrait.php +++ b/src/Traits/RandomStringTrait.php @@ -26,8 +26,14 @@ public function randomString($length = 10) if (!is_numeric($length) || $length <= 0) { $length = 10; } - $string = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + $length = (int)$length; + $alphabet = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + $alphabetLength = strlen($alphabet); + $result = ''; + for ($i = 0; $i < $length; $i++) { + $result .= $alphabet[random_int(0, $alphabetLength - 1)]; + } - return substr(str_shuffle($string), 0, $length); + return $result; } } diff --git a/tests/TestCase/Traits/RandomStringTraitTest.php b/tests/TestCase/Traits/RandomStringTraitTest.php index 46641b62..a62a8a6c 100644 --- a/tests/TestCase/Traits/RandomStringTraitTest.php +++ b/tests/TestCase/Traits/RandomStringTraitTest.php @@ -33,18 +33,29 @@ public function tearDown(): void parent::tearDown(); } - public function testRandomString() + public function testRandomStringLength() { - $result = $this->Trait->randomString(); - $this->assertEquals(10, strlen($result)); - - $result = $this->Trait->randomString(30); - $this->assertEquals(30, strlen($result)); + $this->assertSame(10, strlen($this->Trait->randomString())); + $this->assertSame(30, strlen($this->Trait->randomString(30))); + $this->assertSame(10, strlen($this->Trait->randomString('-300'))); + $this->assertSame(10, strlen($this->Trait->randomString('text'))); + } - $result = $this->Trait->randomString('-300'); - $this->assertEquals(10, strlen($result)); + public function testRandomStringUsesSecureRandomness() + { + $first = $this->Trait->randomString(32); + $second = $this->Trait->randomString(32); + + $this->assertSame(32, strlen($first)); + $this->assertSame(32, strlen($second)); + $this->assertNotSame($first, $second); + $this->assertMatchesRegularExpression('/^[0-9a-zA-Z]+$/', $first); + $this->assertMatchesRegularExpression('/^[0-9a-zA-Z]+$/', $second); + } - $result = $this->Trait->randomString('text'); - $this->assertEquals(10, strlen($result)); + public function testRandomStringOddLength() + { + $this->assertSame(31, strlen($this->Trait->randomString(31))); + $this->assertSame(1, strlen($this->Trait->randomString(1))); } }