Kaynağa Gözat

fix: reject malformed language quality values

Jose Tejera 3 ay önce
ebeveyn
işleme
cc5a116e7a
2 değiştirilmiş dosya ile 7 ekleme ve 1 silme
  1. 1 1
      lib/I18n.php
  2. 6 0
      tst/I18nTest.php

+ 1 - 1
lib/I18n.php

@@ -230,7 +230,7 @@ class I18n
             $languageRanges = explode(',', trim($_SERVER['HTTP_ACCEPT_LANGUAGE']));
             $languageRanges = explode(',', trim($_SERVER['HTTP_ACCEPT_LANGUAGE']));
             foreach ($languageRanges as $languageRange) {
             foreach ($languageRanges as $languageRange) {
                 if (preg_match(
                 if (preg_match(
-                    '/(\*|[a-zA-Z0-9]{1,8}(?:-[a-zA-Z0-9]{1,8})*)(?:\s*;\s*q\s*=\s*(0(?:\.\d{0,3})|1(?:\.0{0,3})))?/',
+                    '/^(\*|[a-zA-Z0-9]{1,8}(?:-[a-zA-Z0-9]{1,8})*)(?:\s*;\s*q\s*=\s*(0(?:\.\d{0,3})|1(?:\.0{0,3})))?$/',
                     trim($languageRange), $match
                     trim($languageRange), $match
                 )) {
                 )) {
                     if (!isset($match[2])) {
                     if (!isset($match[2])) {

+ 6 - 0
tst/I18nTest.php

@@ -162,6 +162,12 @@ class I18nTest extends TestCase
         $this->assertEquals('14 minut',  I18n::_('%d minutes', 14), '14 minutes in Czech');
         $this->assertEquals('14 minut',  I18n::_('%d minutes', 14), '14 minutes in Czech');
     }
     }
 
 
+    public function testInvalidBrowserLanguageQualityIsIgnored()
+    {
+        $_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'de;q=2,en;q=0.8';
+        $this->assertSame(['0.8' => ['en']], I18n::getBrowserLanguages());
+    }
+
     public function testBrowserLanguageAnyDetection()
     public function testBrowserLanguageAnyDetection()
     {
     {
         $_SERVER['HTTP_ACCEPT_LANGUAGE'] = '*';
         $_SERVER['HTTP_ACCEPT_LANGUAGE'] = '*';