php लारवेल में पोस्ट अनुरोध 5.7, लार्वा 5.8-त्रुटि-419 क्षमा करें, आपका सत्र समाप्त हो गया है




laravel (20)

मैंने लारवेल 5.7 स्थापित किया

फ़ाइल के लिए एक फ़ॉर्म जोड़ा गया \resources\views\welcome.blade.php

<form method="POST" action="/foo" >
    @csrf
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

\routes\web.php जोड़ा गया

Route::post('/foo', function () {
    echo 1;
    return;
});

पोस्ट अनुरोध भेजने के बाद:

419 क्षमा करें, आपका सत्र समाप्त हो गया है। कृपया रिफ्रेश करें और पुनः प्रयास करें।

संस्करण 5.6 ऐसी कोई समस्या नहीं थी।


अपने Http/Kernel.php

इस लाइन पर टिप्पणी करने का प्रयास करें:

\Illuminate\Session\Middleware\AuthenticateSession::class,

अपने वेब मिडिलवेयर सरणी में

यह आपके मुद्दे की जड़ हो सकता है


ऐसा इसलिए है क्योंकि फॉर्म में सीएसआरएफ की आवश्यकता होती है। 5.7 संस्करण में, उन्होंने इसे @csrf में बदल दिया

<form action="" method="post">
    @csrf
    ...

संदर्भ: https://laravel.com/docs/5.7/csrf


मुझे भी इस तरह की समस्या थी और मुझे पता चला है कि सत्र की फाइलें लिखने के लिए बंद थीं। इसलिए, मुझे नहीं पता कि आप अपना लारवेल योनि या डोकर जैसे सामानों के माध्यम से चला रहे हैं, लेकिन मैं आपको सलाह देता हूं कि सत्र निर्देशिका (और निश्चित रूप से फाइलों) के अधिकारों को बदलने की कोशिश करें (जब आप एक वीएम में लारवेल को चलाते हैं तो आपको स्थानीय रूप से और VM में अधिकारों को बदलें (जैसे, जब आप NFS के माध्यम से फ़ाइलें साझा करते हैं)

ऐशे ही:

chmod -R 777 storage/framework/sessions
chmod -R 777 storage/logs

मुझे पता है, एक 777 अनुमति सबसे खराब आपदा है जिसकी आप कभी कल्पना भी कर सकते हैं। लेकिन वे समस्या निवारण के लिए काम कर रहे हैं।

यह सुनिश्चित करने के लिए कि मैं इसे कभी नहीं भूल सकता मैंने बैश स्क्रिप्ट बनाई। (इसे लैग्ल कहा जाता है, सिर्फ इसलिए कि मैं लॉग फ़ाइलों को साफ़ करना चाहता हूं और अनुमतियां सेट करना चाहता हूं)

नोट: सुनिश्चित करें कि आप सत्र निर्देशिका पर इसका उपयोग करते हैं। Config / session.php में स्थान के साथ घोषित एक files कुंजी है। मेरे मामले में:

<?php
//...........
'files' => storage_path('framework/sessions'),
//...........

स्थान: / usr / bin / lalog (यह एक फ़ाइल है, निर्देशिका नहीं है)
शैल के रूप में lalog में निष्पादित करें

#!/bin/bash
rm -rf /home/username/Projects/x/storage/logs/laravel.log
echo "Laravel log removed"
touch /home/username/Projects/x/storage/logs/laravel.log
echo "Laravel log created"
chmod -R 777 /home/username/Projects/x/storage/
echo "CHMOD 777 on Storage dir"

चेतावनी! यह सभी के लिए लिखने की अनुमति देगा, इसलिए इसके साथ लापरवाह रहें! इसके अलावा, शायद लारवेल की लॉग फ़ाइल में कुछ उपयोगी जानकारी है। (मेरी बैश स्क्रिप्ट चलाने से पहले उस लॉग फ़ाइल में देखना सुनिश्चित करें)

इसके अलावा, मुझे पता है कि यह पहले से ही उल्लेख किया गया है। लेकिन, पूरी तरह से निश्चित रहें कि आप हमेशा

  1. ब्राउज़र में कुकीज़ की अनुमति दें, इसलिए टोकन कुकीज़ में सेट किया जा सकता है
  2. जांचें कि क्या आप अपनी ब्लेड फ़ाइल में @csrf का उपयोग कर रहे हैं

रूप कुछ इस तरह होना चाहिए

<form method="POST" action="{{ route('login') }}">
@csrf
.......
</form>

एक त्वरित बुरा तरीका यह है कि app \ http \ midware \ verifycsrftoken.php पर जाएं और सूची को छोड़कर $ में मार्ग जोड़ें। CSRF टोकन सत्यापन के लिए पोस्ट अनुरोध को अनदेखा किया जाएगा।

protected $except = [
    //
    'doLogin.aspx',
    'create_coupon',
];

<form method="POST" action="{{ url('foo') }}" >

or 
composer update or composer install

or 
in your Http/Kernel.php comment this line (not recommended)
// \App\Http\Middleware\VerifyCsrfToken::class,

यह ओवरकिल हो सकता है लेकिन आप यह कोशिश कर सकते हैं:

// छिपे हुए टोकन फ़ील्ड के साथ नामांकित मार्ग जोड़ा गया।

<form method="POST" action="{{ route('foo') }}" >
    @csrf
    <input type="hidden" name="_token" value="{!! csrf_token() !!}">
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

// नामांकित मार्ग

Route::post('/foo', function () {
    return 'bar';
})->name('foo');

// इसे <head></head> ब्लॉक के भीतर जोड़ें:

<meta name="_token" content="{!! csrf_token() !!}" />

मैंने इसे अपने लोकल पर होमस्टेड पर लारवेल 5.7 का उपयोग करते हुए परीक्षण किया था जो कि लारावेल इंस्टालर 2.0.1 का उपयोग करके ताज़ा इंस्टॉल था और यह काम किया। आपका पर्यावरण क्या है?

सिद्धांत: मुझे आश्चर्य है कि अगर ब्लेड के साथ कुछ करना है html टैग {{ }} बनाम {!! !!} {!! !!} अपने पर्यावरण पर या आप इसे कैसे परोस रहे हैं (जैसे। php artisan serve )। मुझे क्या लगता है कि line 335 ऑफ line 335 /vendor/laravel/framework/src/illuminate/Foundation/helpers.php को उसी लाइन को मैन्युअल रूप से ऊपर टाइप किया हुआ रेंडर करना चाहिए।


मुझे इसी तरह की समस्या हुई है और मुझे इसका हल मिल गया है

यदि आप गूंज रहे हैं या कंट्रोलर से कुछ प्रिंट करते हैं तो देखने के लिए यह समस्या पॉप अप होगी।

इसलिए सुनिश्चित करें कि आप अपने नियंत्रक के वापस आने पर इको या प्रिंट का उपयोग नहीं कर रहे हैं


इतने समय के बाद मैंने इसे इस तरह से हल किया

मेरा लार्वा इंस्टॉलेशन पथ कॉन्फ़िगर फ़ाइल सेशन में सेट के समान नहीं था

'domain' => env('SESSION_DOMAIN', 'example.com'),

मेरे पास बस वही मुद्दा था और यह मेरे लिए पूरी तरह से बेवकूफ था। मैंने कहा फार्म जमा करने से पहले जावास्क्रिप्ट के माध्यम से सभी फॉर्म फ़ील्ड (केवल सबमिट बटन के बजाय) को अक्षम कर दिया था! यह निश्चित रूप से, सभी फार्म तत्वों को प्रस्तुत नहीं किया जा रहा है (छिपे हुए _token फ़ील्ड सहित) जो बदले में 419 त्रुटि लाया!

मुझे आशा है कि यह किसी को कुछ घंटों तक सिर खुजाने में मदद करता है!

अक्षम प्रपत्र जानकारी अनुरोध में दिखाई नहीं देती हैं


\App\Http\Middleware\EncryptCookies::class बाहर की टिप्पणी करने का प्रयास करें \App\Http\Middleware\EncryptCookies::class in \app\Http\Kernel.php मैं ऐसी ही समस्या है और ऐसा करके इसे हल किया है। शायद सबसे अच्छा समाधान नहीं है क्योंकि सुरक्षा लेकिन कम से कम यह काम किया।

पहले मैंने कोशिश की थी:

  • कैश को साफ़ करें
  • नई एप्लिकेशन कुंजी उत्पन्न करें
  • मेरे एप्लिकेशन को विभिन्न ब्राउज़रों में चलाएं (Chrome 70, मोज़िला फ़ायरफ़ॉक्स 57, और IE 11)
  • मेरे ऐप को दूसरे कंप्यूटर में चलाएं
  • बाहर की टिप्पणी करें \App\Http\Middleware\VerifyCsrfToken::class in \app\Http\Kernel.php
  • बाहर टिप्पणी करें \Illuminate\Session\Middleware\AuthenticateSession::class in \app\Http\Kernel.php
  • उन्नयन और डाउनग्रेड Laravel (5.6 और 5.7 के बीच)

लेकिन इनमें से किसी ने भी मेरे लिए काम नहीं किया।

संपादित करें

यहां मेरा मामला हर बार है जब मैं लॉगिन करता हूं, एक नया सत्र फ़ाइल बनाई जाएगी (पुराना वाला अभी भी कायम है, लेकिन अचानक भूल गया है। storage/framework/sessions ) और नया सीएसआरएफ टोकन उत्पन्न होता है। तो समस्या VerifyCsrfToken के साथ नहीं है।

जैसा कि @Vladd ने टिप्पणी अनुभाग में उल्लेख किया है, आपको कभी भी \App\Http\Middleware\VerifyCsrfToken::class टिप्पणी नहीं करनी चाहिए। आपको जाँचना होगा कि आपने सर्वर को सही CSRF TOKEN भेजा है।


आपने CSRF फ़ील्ड को गलत तरीके से जोड़ा है। @csrf बजाय आपको इस तरह csrf_field() उपयोग करना चाहिए:

<form method="POST" action="/foo" >
    {{ csrf_field() }}
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

नीचे पढ़ने से पहले सुनिश्चित करें कि आपके पास आपके फॉर्म में @csrf या {{ csrf_field() }} है

<form method="post">
@csrf <!-- {{ csrf_field() }} -->
... rest of form ...
</form>

सत्र समाप्त हो गया त्रुटि संदेश आता है क्योंकि कहीं न कहीं आपका सीएसआरएफ टोकन सत्यापन विफल हो जाता है जिसका अर्थ है कि App\Http\Middleware\VerifyCsrfToken::class मिडलवेयर पहले से चालू है। फॉर्म में @csrf ब्लेड निर्देश पहले से ही जोड़ा गया है, जो ठीक भी होना चाहिए।

फिर दूसरे क्षेत्र की जाँच करना सत्र है। csrf टोकन सत्यापन सीधे आपके सत्र के साथ शामिल है, इसलिए आप यह जांचना चाहते हैं कि आपका सत्र ड्राइवर काम कर रहा है या नहीं, जैसे कि गलत तरीके से कॉन्फ़िगर किया गया रेडिस एक समस्या पैदा कर सकता है।

हो सकता है कि आप अपने .env फ़ाइल से अपने सत्र ड्राइवर / सॉफ़्टवेयर को स्विच करने का प्रयास कर सकते हैं, समर्थित ड्राइवर नीचे दिए गए हैं

Laravel 5.7 (Doc Link) में समर्थित सत्र ड्राइवर

  • file - सत्र भंडारण / ढांचे / सत्रों में संग्रहीत किए जाते हैं।
  • cookie - सत्र सुरक्षित, एन्क्रिप्टेड कुकीज़ में संग्रहीत हैं।
  • database - सत्र एक रिलेशनल डेटाबेस में संग्रहीत होते हैं।
  • memcached / redis - सत्र इनमें से एक फास्ट, कैश आधारित स्टोर में संग्रहीत किए जाते हैं।
  • array - सत्र एक PHP सरणी में संग्रहीत किए जाते हैं और इसे बनाए नहीं रखा जाएगा।

यदि आपका फॉर्म सत्र ड्राइवर को स्विच करने के बाद काम करता है, तो उस विशेष ड्राइवर के साथ कुछ गलत है, वहां से त्रुटि को ठीक करने का प्रयास करें।

संभावित त्रुटि परिदृश्यों की संभावना

  • संभवतः फ़ाइल-आधारित सत्र /storage निर्देशिका के साथ अनुमति के मुद्दों के कारण काम नहीं कर सकते हैं (एक त्वरित googling आपको समाधान लाएगा)

  • डेटाबेस ड्राइवर के मामले में, आपका DB कनेक्शन गलत हो सकता है, या sessions तालिका मौजूद नहीं हो सकती है या गलत तरीके से कॉन्फ़िगर की गई है (गलत कॉन्फ़िगरेशन भाग @Junaid Qadir द्वारा टिप्पणी के अनुसार एक समस्या होने की पुष्टि की गई थी)।

  • redis/memcached कॉन्फ़िगरेशन गलत है या एक ही समय में सिस्टम में कोड के किसी अन्य टुकड़े द्वारा हेरफेर किया जा रहा है।

यह php artisan key:generate को निष्पादित करने के लिए एक अच्छा विचार हो सकता है php artisan key:generate एक नया ऐप कुंजी php artisan key:generate और उत्पन्न करता है जो सत्र डेटा को फ्लश करेगा।

स्पष्ट ब्राउज़र कैश हार्ड , मैंने पाया कि क्रोम और फ़ायरफ़ॉक्स मुझे याद रखने की तुलना में अधिक अपराधी हैं।

एप्लिकेशन कुंजियाँ महत्वपूर्ण क्यों हैं, इसके बारे में और पढ़ें


डिफ़ॉल्ट रूप से मुझे यह समस्या नहीं थी। इसलिए मैंने जो किया वह समस्या को दोहराने के लिए chmod -R 644 sessions है।

बाद में मैंने chmod -R 755 sessions द्वारा सत्र फ़ोल्डर की अनुमति दी

अब मेरा प्रोजेक्ट कोड फिर से काम करता है।

कारण यह होता है कि आप लेखन अनुमति की कमी के साथ फ़ाइल पर अपना कैश संग्रहीत करते हैं।

सत्र कॉन्फ़िगरेशन फ़ाइल कॉन्फ़िग / सत्र.php पर संग्रहीत है। इस फ़ाइल में आपके लिए उपलब्ध विकल्पों की समीक्षा करना सुनिश्चित करें। डिफ़ॉल्ट रूप से, लारवेल को फ़ाइल सत्र ड्राइवर का उपयोग करने के लिए कॉन्फ़िगर किया गया है, जो कई अनुप्रयोगों के लिए अच्छी तरह से काम करेगा। उत्पादन अनुप्रयोगों में, आप तेजी से सत्र के प्रदर्शन के लिए मेम्केड या रेडिस ड्राइवरों का उपयोग करने पर विचार कर सकते हैं।

समाधान की:

1 - जैसा कि मैंने ऊपर तय किया है कि आप सत्र फ़ोल्डर को 755 अनुमति दे सकते हैं। 2 - आप दूसरे सत्र ड्राइवर कॉन्फ़िगरेशन का उपयोग कर सकते हैं।

फ़ाइल - सत्र भंडारण / ढांचे / सत्रों में संग्रहीत किए जाते हैं। कुकी - सत्र सुरक्षित, एन्क्रिप्टेड कुकीज़ में संग्रहीत हैं। डेटाबेस - सत्र एक रिलेशनल डेटाबेस में संग्रहीत होते हैं। memcached / redis - सत्र इनमें से एक फास्ट, कैश आधारित स्टोर में संग्रहीत किए जाते हैं। सरणी - सत्र एक PHP सरणी में संग्रहीत किए जाते हैं और इसे बनाए नहीं रखा जाएगा।

ध्यान में रखना; यदि आप memcached / redis का उपयोग करना चाहते हैं, तो आपको उन्हें अपने सर्वर पर स्थापित करने की आवश्यकता है या आपका docker redis कंटेनर चलना चाहिए।


दरअसल SCRF एक सत्र आधारित टोकन है। मार्ग समूह में अपना मार्ग जोड़ें और एक मिडलवेयर जोड़ें जो सत्रों को नियंत्रित करता है।

लार्वा में वेब एक डिफ़ॉल्ट मिडलवेयर है और यह सत्र अनुरोधों को नियंत्रित कर सकता है।

Route::group(array('middleware' => ['web']), function () {
  Route::post('/foo', function () {
     echo 1;
     return;
  });
});

केस 1: यदि आप अपने स्थानीय सिस्टम जैसे 127.0.01: 8000 में प्रोजेक्ट चला रहे हैं,

फिर

अपनी .env फ़ाइल में SESSION_DOMAIN= जोड़ें

या आपके कॉन्‍फ़िगर / सेशन में .php 'domain' => env('SESSION_DOMAIN', ''),

और फिर php artisan cache:clear चलाएं php artisan cache:clear

स्थिति 2: यदि प्रोजेक्ट सर्वर पर चल रहा है और आपके पास "mydomain.com" जैसा डोमेन है

अपनी .env फ़ाइल में SESSION_DOMAIN=mydomain.com जोड़ें

या आपके config / session.php 'domain' => env('SESSION_DOMAIN', 'mydomain.com'),

और फिर php artisan cache:clear चलाएं php artisan cache:clear


बस .env SESSION_DRIVER = कुकी बदलें


मेरे मामले में, यह बहुत हास्यास्पद है। रूट फ़ाइल के शीर्ष पर Auth::routes() को डालने पर मुझे त्रुटि 419 मिलती है।

Auth::routes();

Route::middleware('auth')->group(function () {
    Route::get('/', '[email protected]')->name('dashboard');
});

और मैंने Auth::routes(); को स्थानांतरित करके त्रुटि को ठीक किया Auth::routes(); मार्ग फ़ाइल के नीचे।

Route::middleware('auth')->group(function () {
    Route::get('/', '[email protected]')->name('dashboard');
});

Auth::routes();

शायद यह आपके मामले में भी मदद कर सकता है। सौभाग्य।


कोड में कोई समस्या नहीं है। मैंने उसी कोड से जाँच की है जैसा आपने नई स्थापना के साथ लिखा है।

फॉर्म कोड:

<form method="POST" action="/foo" >
    @csrf
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

web.php फ़ाइल कोड:

Route::get('/', function () {
    return view('welcome');
});

Route::post('/foo', function () {
    echo 1;
    return;
});

फॉर्म जमा करने के बाद का परिणाम है:

यदि आप अपना ब्राउज़र कैश साफ़ करते हैं या अन्य ब्राउज़र के साथ प्रयास करते हैं, तो मुझे लगता है कि यह ठीक हो जाएगा।


मुझे यह मुद्दा बहुत पहले मिला था। मुझे याद आया कि यह storage/framework/sessions की अनुमति देता है। आप इसे chmod -R 0777 storage/framework/sessions कमांड द्वारा बदल सकते हैं। इसने मेरे लिए काम किया।


अपने @csrf को @csrf से <input type="hidden" name="_token" value="{{ csrf_token() }}">

तो आपका कोड इस प्रकार है:

<form method="POST" action="/foo" >
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>

   <button type="submit">Submit</button>
</form>




laravel