2017-01-09 7 views
18

मुझे लैरवेल 5.3 (विंडोज सर्वर पर) के साथ एक ही समस्या है। मैं हर संभव प्रयास किया: स्पष्ट, config: .env फ़ाइल, config, कारीगर नया कुंजी पीढ़ी, कैश जाँच की स्पष्ट, संगीतकार अद्यतन, लेकिन समस्या यह बेतरतीब ढंग से बनी हुई है।रैंडम रनटाइम अपवाद: एकमात्र समर्थित सिफर एईएस-128-सीबीसी और एईएस -256-सीबीसी हैं, सही कुंजी लंबाई

ध्यान दें कि अपाचे, mysql, php के बिल्कुल वैसा ही संस्करण के साथ एक ही कोड, मैक ओएस पर इस समस्या उत्पन्न नहीं करता है।

मैंने पाया कि कुंजी (encrypter constractor के पहले पैरामीटर) आता है "कभी कभी" खाली और निश्चित रूप से यह विफल रहता है। अधिकांश बार कुंजी सही होती है, लेकिन यादृच्छिक रूप से कुंजी एन्क्रिप्शन सेवाप्रदाता से खाली होती है जो बदले में इसे ऐप कॉन्फ़िगरेशन से पूछती है।

तो मेरे लिए काम करने वाला एकमात्र समाधान एन्क्रिप्शन सेवाप्रदाता में if ($key) जोड़ना था ताकि एन्क्रिप्शन कन्स्ट्रक्टर को खाली कुंजी के साथ बुलाया न जाए।

बेशक

एक "क्लीन" समाधान नहीं है और न ही यह समस्या बताते हैं, लेकिन कम से कम लॉग त्रुटि से भरा फ़ाइल खोजने के लिए बचा जाता है: यदि यह एक Laravel बग मुझे नहीं पता है

RuntimeException: The only supported ciphers are AES-128-CBC and AES-256-CBC and pages are displayed correctly.

पता है, लेकिन निश्चित रूप से अगर कोई इसे समझा सकता है तो मुझे और जानकर खुशी होगी।

नीचे मेरी संशोधित वर्ग है:

class EncryptionServiceProvider extends ServiceProvider 
{ 
    /** 
    * Register the service provider. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->app->singleton('encrypter', function ($app) { 
      $config = $app->make('config')->get('app'); 

      // If the key starts with "base64:", we will need to decode the key before handing 
      // it off to the encrypter. Keys may be base-64 encoded for presentation and we 
      // want to make sure to convert them back to the raw bytes before encrypting. 
      if (Str::startsWith($key = $config['key'], 'base64:')) { 
       $key = base64_decode(substr($key, 7)); 
      } 
     if ($key) 
      return new Encrypter($key, $config['cipher']); 
     }); 
    } 
} 

अधिक जानकारी और पश्व-अनुरेखन लॉग:: मैं बस new Encrypter से पहले if ($key) लाइन जोड़ा

बेशक

, जैसा कि मैंने लिखा था मैं जाँच की, .env फ़ाइल, कॉन्फ़िगरेशन, कारीगर नई कुंजी पीढ़ी, कैश: स्पष्ट, कॉन्फ़िगरेशन: स्पष्ट, संगीतकार अद्यतन। इस सामान के बाद से यह समय के 99% काम करता है लेकिन बेतरतीब ढंग से मैं त्रुटि मिलती है ठीक है।

यहाँ वापस ट्रेस: ​​

[2017-01-09 10:25:40] test.ERROR: RuntimeException: The only supported ciphers are AES-128-CBC and AES-256-CBC with the correct key lengths. in C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Encryption\Encrypter.php:43

स्टैक ट्रेस: ​​

#0 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Encryption\EncryptionServiceProvider.php(27): Illuminate\Encryption\Encrypter->__construct('', 'AES-256-CBC') 
#1 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Container\Container.php(746): Illuminate\Encryption\EncryptionServiceProvider->Illuminate\Encryption\{closure}(Object(Illuminate\Foundation\Application), Array) 
#2 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Container\Container.php(644): Illuminate\Container\Container->build(Object(Closure), Array) 
#3 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Foundation\Application.php(709): Illuminate\Container\Container->make('encrypter', Array) 
#4 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Container\Container.php(864): Illuminate\Foundation\Application->make('encrypter') 
#5 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Container\Container.php(819): Illuminate\Container\Container->resolveClass(Object(ReflectionParameter)) 
#6 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Container\Container.php(788): Illuminate\Container\Container->getDependencies(Array, Array) 
#7 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Container\Container.php(644): Illuminate\Container\Container->build('App\\Http\\Middle...', Array) 
#8 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Foundation\Application.php(709): Illuminate\Container\Container->make('App\\Http\\Middle...', Array) 
#9 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(127): Illuminate\Foundation\Application->make('App\\Http\\Middle...') 
#10 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(33): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
#11 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\View\Middleware\ShareErrorsFromSession.php(49): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) 
#12 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(137): Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure)) 
#13 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(33): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
#14 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Session\Middleware\StartSession.php(64): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) 
#15 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(137): Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure)) 
#16 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(33): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
#17 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse.php(37): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) 
#18 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(137): Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure)) 
#19 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(33): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
#20 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(104): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) 
#21 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Router.php(655): Illuminate\Pipeline\Pipeline->then(Object(Closure)) 
#22 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Router.php(629): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request)) 
#23 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Router.php(607): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request)) 
#24 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(268): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request)) 
#25 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(53): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request)) 
#26 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode.php(46): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) 
#27 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(137): Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure)) 
#28 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(33): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
#29 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(104): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) 
#30 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(150): Illuminate\Pipeline\Pipeline->then(Object(Closure)) 
#31 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(117): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request)) 
#32 C:\Apache24\htdocs\sph\public\index.php(53): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request)) 
#33 {main} 
+0

इसमें रूचि है। इस मुद्दे को दो बार और "बस" ढांचे को पुनर्स्थापित करने से यह हल हो जाएगा। मुझे सच में आश्चर्य है कि क्यों। – Loek

+0

क्या आपने 'php artisan key: gener' चलाया था? –

+0

इसके अलावा, क्या आपने 'debug_print_backtrace() की कोशिश की है; 'जब कुंजी * * शून्य है? प्रत्येक कॉल पर कॉल स्टैक और 'error_log()' कुंजी मान का पता लगाना दिलचस्प हो सकता है। –

उत्तर

-3

यह बहुत आसान, .envAPP_KEY से फ़ाइल config/app.php -> key को कॉपी या नीचे आदेश चला जाता है:

php artisan key:generate

-2

मैंने लैरवेल 5.3 स्थापित किया और मुझे वहां एक .env फ़ाइल नहीं मिली। और उछाल .... वह मुद्दा था। मैंने एप्लिकेशन की जड़ में .env फ़ाइल बनाई और

php artisan key:generate

टर्मिनल में और यह टर्मिनल में बेस 64 एन्कोडेड स्ट्रिंग उत्पन्न हुआ। उस स्ट्रिंग को .env फ़ाइल में

APP_KEY=base64:************************************************

जहां **** एन्कोडेड स्ट्रिंग जेनरेट की गई है। एप्लिकेशन को फिर से चलाएं और इसे काम करना चाहिए।

9

समस्या इसलिए होती है जब मल्टी-थ्रेडेड वेब सर्वर पर PHP के धागे की सुरक्षित संस्करणों का उपयोग कर, बजाय बहु-प्रक्रिया वेब सर्वर के।आप Github issue here, Github issue here, और PHP bug report here पर इस मुद्दे के बारे में कुछ और पढ़ सकते हैं। कुछ और लिंक हैं, लेकिन वे पोस्ट किए गए कुछ लोगों से सिर्फ ब्रांच किए गए हैं।

मूलभूत बात यह है कि बहु-थ्रेडेड वेब सर्वर के साथ, आपके पास एक ही प्रक्रिया है जो एकाधिक धागे को संभालती है। हालांकि, putenv()/getenv() विधियां थ्रेड सुरक्षित नहीं हैं, और प्रक्रिया स्तर पर पर्यावरण चर बदलती हैं, इसलिए उस प्रक्रिया के तहत सभी धागे प्रभावित होते हैं। (this issue में वर्णित है):

Request 1: {starts --- loads env --- work --- finishes} 
Request 2:        {starts ----- loads env --- work --- finishes} 

तो, का अनुरोध 1, में आता है ठीक पर्यावरण लोड करता है, और काम करने के लिए हो जाता है

तो, आप ऊपर कुछ इस तरह के साथ समाप्त। जबकि अनुरोध 1 काम कर रहा है, अनुरोध 2 आता है और दूसरे धागे पर शुरू होता है। अनुरोध 2 से पहले पर्यावरण चर को पढ़ता है, अनुरोध 1 समाप्त होता है और PHP putenv() द्वारा निर्धारित सभी चर साफ़ करता है। अब, पर्यावरण को पढ़ने के 2 प्रयासों का अनुरोध करें, लेकिन null प्राप्त हो जाता है क्योंकि अनुरोध 1 समाप्त होने पर चर साफ़ कर दिए गए थे।

यह समस्या दो तरह से कम किया जा सकता:

  1. उत्पादन में एक .env फ़ाइल का प्रयोग न करें। पर्यावरण चर सीधे सेट करें, और phpdotenv अक्षम करें। यह भी package itself ने यह बताया है:

    phpdotenv is made for development environments, and generally should not be used in production. In production, the actual environment variables should be set so that there is no overhead of loading the .env file on each request.

  2. कभी config फाइल के बाहर env() विधि का उपयोग करें, और सुनिश्चित करें कि आप अपने config फ़ाइलों को कैश कर सकते हैं। इस विधि का उपयोग करके, पर्यावरण एक बार पढ़ा जाता है: जब आप कॉन्फ़िगरेशन फ़ाइल कैश बनाते हैं। प्रत्येक वास्तविक वेब अनुरोध कैश से डेटा पढ़ेगा, और पर्यावरण चर कभी भी स्पर्श नहीं होगा।

+0

@cytsunny बस सोच रहा है कि क्या यह जवाब वह है जिसे आप ढूंढ रहे थे। – patricus

+0

मैंने अप-वोट किया। बस बेहतर जवाब देने के लिए इंतजार करना चाहते हैं। (उदाहरण के लिए ओपी की तरह हैक के बिना .env का उपयोग करते समय समस्या को हल करना) अगर आपको बक्षीस समाप्त होने से पहले कोई अन्य उत्तर नहीं मिलता है तो आपको बक्षीस मिलेगा। – cytsunny

संबंधित मुद्दे