লারাভেল সিএসআরএফ আজান পোষ্ট অনুরোধের জন্য টোকেন অমিল


122

আমি অজ্যাক্সের মাধ্যমে ডেটাবেস থেকে ডেটা মুছতে চেষ্টা করছি।

এইচটিএমএল:

@foreach($a as $lis)
  //some code
  <a href="#" class="delteadd" id="{{$lis['id']}}">Delete</a>
  //click action perform on this link                  
@endforeach

আমার এজাক্স কোড:

$('body').on('click', '.delteadd', function (e) {
e.preventDefault();
//alert('am i here');
if (confirm('Are you sure you want to Delete Ad ?')) {
    var id = $(this).attr('id');
    $.ajax({
        method: "POST",
        url: "{{url()}}/delteadd",
        }).done(function( msg ) {
        if(msg.error == 0){
            //$('.sucess-status-update').html(msg.message);
            alert(msg.message);
        }else{
            alert(msg.message);
            //$('.error-favourite-message').html(msg.message);
        }
    });
} else {
    return false;
}
});

এটি ডাটাবেস থেকে ডেটা আনার জন্য আমার জিজ্ঞাসা ...

$a = Test::with('hitsCount')->where('userid', $id)->get()->toArray();

তবে আমি যখন মুছে ফেলা লিঙ্ক ডেটা মুছে ফেলাতে ক্লিক করি না এবং সিএসআরএফ_ টোকেন অমিল দেখায় ...



আপনার এজ্যাক্স কোডটিতে আপনার সাফল্য এবং ত্রুটি যুক্ত করা উচিত। ত্রুটি সমস্যাটি দেখাবে। stackoverflow.com/questions/45668337/…
রেজা জাফারি

উত্তর:


191

আপনার এজাক্স অনুরোধে আপনাকে ডেটা যুক্ত করতে হবে । আমি আশা করি তাই কাজ হবে।

data: {
        "_token": "{{ csrf_token() }}",
        "id": id
        }

34
যদি অজাক্স ফাংশনটি .jsফাইলে থাকে?
ব্রেন

4
এটি লারাভেল ৫.7 এ কাজ করে না। জারপিওর উত্তরটি সঠিক।
ওমর মার্সিয়া

4
ফাংশন একটি PARAM যেমন টোকেন পাঠান @Brane
Abdelalim Hassouna

এটি লারাভেল ৫.৮ এ কাজ করে না। এটি এখনও টোকেন মেলেনি। একটি সহজ সমাধানের জন্য নীচে আমার উত্তরটি চেক করুন
Gjaa

একটি জেসন অনুরোধের পরে লারাভেল সিএসআরএফ টোকেন পরিবর্তন করে? আপনার নতুন পৃষ্ঠাটি প্রধান পৃষ্ঠায় প্রেরণ করা দরকার?
davefrasoni

202

এই সমস্যাটি সমাধানের সর্বোত্তম উপায় "এক্স-সিএসআরএফ-টোকেন" হ'ল নিম্নলিখিত কোডটি আপনার মূল বিন্যাসে যুক্ত করা এবং আপনার এজাক্স কলগুলি চালিয়ে যাওয়া চালিয়ে যাওয়া:

শিরোনামে

<meta name="csrf-token" content="{{ csrf_token() }}" />

লিপিতে

<script type="text/javascript">
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});
</script>

6
ধন্যবাদ মানুষ. এটি আরও ভাল গোলাকার সমাধান! এইভাবে আপনি এটি একবার সেট আপ করেন এবং তারপরে আপনার সাধারণ aj .জ্যাক্স কোডটি লিখতে যান।
pkid169

4
এটি আরও ভাল সমাধান কারণ আপনি .jsফাইলগুলির মধ্যে এটি ব্যবহার করতে পারেন
অ্যাডাম

4
এখন পর্যন্ত সেরা উত্তর। ধন্যবাদ
পল ডেনিসেভিচ

"গ্লোবাল: মিথ্যা" হলে কী হবে?
মিশেল

4
প্রতিটি কল করার পরে কীভাবে সিএসআরএফ আপডেট করা যায়? প্রথম কলটি দুর্দান্ত কাজ করে, সাবএসইউেন্ট কলগুলি সিএসআরএফ টোকেনের কারণে ব্যর্থ হয়েছে।
Jjsg08

28

আমার মনে হয় ফর্মটিতে টোকেনটি আরও ভাল করে দেওয়া উচিত, এবং আইডি দিয়ে এই টোকেনটি পান

<input type="hidden" name="_token" id="token" value="{{ csrf_token() }}">

এবং জ্যাকিউয়ারি:

var data = {
        "_token": $('#token').val()
    };

এইভাবে, আপনার জেএস আপনার ব্লেড ফাইলগুলিতে থাকার দরকার নেই।


27

আমি স্রেফ headers:এজাক্স কলে যুক্ত করেছি:

  headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},

দেখুন:

<div id = 'msg'>
     This message will be replaced using Ajax. Click the button to replace the message.
</div>

{{ Form::submit('Change', array('id' => 'ajax')) }}

এজ্যাক্স ফাংশন:

<script>
 $(document).ready(function() {
    $(document).on('click', '#ajax', function () {
      $.ajax({
         type:'POST',
         url:'/ajax',
         headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
         success:function(data){
            $("#msg").html(data.msg);
         }
      });
    });
});
</script>

নিয়ামক মধ্যে:

public function call(){
    $msg = "This is a simple message.";
    return response()->json(array('msg'=> $msg), 200);
}

ways.php এ

Route::post('ajax', 'AjaxController@call');

4
এজ্যাক্স কলটিতে শিরোনাম যুক্ত করা আমাকে সহায়তা করেছিল।
চৌধুরী চৌধুরী ওয়াকাস

4
এটি সেরা উত্তর কারণ এটি ব্লেড ফাইলে থাকা জাভাস্ক্রিপ্টের প্রয়োজন হয় না (যদি আপনি এটি ব্লেড ফাইলে না চান তবে তবে প্রত্যেকবার কেউ সেই পৃষ্ঠাতে আসার সময় এটি রেন্ডার করা হয়)
জাচারি ওয়েক্সেলবাউম

12

আপনি যদি টেমপ্লেট ফাইলগুলি ব্যবহার করেন তবে আপনি নিজের metaট্যাগটি মাথায় রাখতে পারেন section(বা আপনি যা নাম দিন) যাতে আপনার metaট্যাগ রয়েছে।

@section('head')
<meta name="csrf_token" content="{{ csrf_token() }}" />
@endsection

পরবর্তী জিনিস, আপনাকে headersআপনার এট্রিবিউটটি লাগাতে হবে ajax(আমার উদাহরণস্বরূপ, আমি datatableসার্ভার-সাইড প্রসেসিংয়ের সাথে ব্যবহার করছি :

"headers": {'X-CSRF-TOKEN': $('meta[name="csrf_token"]').attr('content')}

এখানে পূর্ণ datatableএজাক্স উদাহরণ রয়েছে:

$('#datatable_users').DataTable({
        "responsive": true,
        "serverSide": true,
        "processing": true,
        "paging": true,
        "searching": { "regex": true },
        "lengthMenu": [ [10, 25, 50, 100, -1], [10, 25, 50, 100, "All"] ],
        "pageLength": 10,
        "ajax": {
            "type": "POST",
            "headers": {'X-CSRF-TOKEN': $('meta[name="csrf_token"]').attr('content')},
            "url": "/getUsers",
            "dataType": "json",
            "contentType": 'application/json; charset=utf-8',
            "data": function (data) {
                console.log(data);
            },
            "complete": function(response) {
                console.log(response);
           }
        }
    });

এটি করার পরে 200 statusআপনার ajaxঅনুরোধটি নেওয়া উচিত ।


6

জেনে রাখুন যে কোনও এক্স-এক্সএসআরএফ-টোকেন কুকি রয়েছে যা সুবিধার জন্য সেট করা আছে। অ্যাংুলার এবং অন্যদের মতো ফ্রেমওয়ার্ক এটিকে ডিফল্টরূপে সেট করে। Https://laravel.com/docs/5.7/csrf#csrf-x-xsrf-to ডক এ এটি পরীক্ষা করে দেখুন আপনি এটি ব্যবহার করতে পছন্দ করতে পারেন।

সর্বোত্তম উপায় হ'ল মেটা ব্যবহার করা, যদি কুকিজ নিষ্ক্রিয় হয়।

    var xsrfToken = decodeURIComponent(readCookie('XSRF-TOKEN'));
    if (xsrfToken) {
        $.ajaxSetup({
            headers: {
                'X-XSRF-TOKEN': xsrfToken
            }
        });
    } else console.error('....');

এখানে প্রস্তাবিত মেটা উপায় (আপনি ক্ষেত্রটি যে কোনও উপায়ে রাখতে পারেন, তবে মেটা শান্ত শান্ত):

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});   

এর ব্যবহারটি লক্ষ্য করুন decodeURIComponent(), এটি ইউরি ফর্ম্যাট থেকে ডিকোড যা কুকি সংরক্ষণ করার জন্য ব্যবহৃত হয়। [অন্যথায় আপনি লারাভেলে একটি অবৈধ পেডলোড ব্যতিক্রম পাবেন]।

এখানে ডক্সে সিএসআরফ কুকি সম্পর্কে বিভাগটি যাচাই করতে হবে: https://laravel.com/docs/5.7/csrf#csrf-x-csrf-token

এছাড়াও এখানে কীভাবে লারাভেল (বুটস্ট্র্যাপ.জেএস) এটি ডিফল্টরূপে অক্ষের জন্য সেট করছে:

let token = document.head.querySelector('meta[name="csrf-token"]');

if (token) {
    window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
} else {
    console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
} 

আপনি চেক যেতে পারেন resources/js/bootstrap.js

এবং এখানে কুকি ফাংশন পড়ুন:

   function readCookie(name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for (var i = 0; i < ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) == ' ') c = c.substring(1, c.length);
            if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
       }
        return null;
    }

6

একটি অ্যাড idকরার metaউপাদান যে টোকেন ঝুলিতে

<meta name="csrf-token" id="csrf-token" content="{{ csrf_token() }}">

এবং তারপরে আপনি এটি আপনার জাভাস্ক্রিপ্টে পেতে পারেন

$.ajax({
  url : "your_url",
  method:"post",
  data : {
    "_token": $('#csrf-token')[0].content  //pass the CSRF_TOKEN()
  },  
  ...
});

সম্পাদনা: metaলাইন পরিবর্তন না করে সহজ উপায় ।

data : { 
    _token: "{{ csrf_token() }}" 
}

বা

data : { 
    _token: @json(csrf_token()), 
}

@ মার্টিন-হার্টম্যানকে ধন্যবাদ


4
আপনি যদি কোনও আইডি যুক্ত করতে না চান তবে কেবলমাত্র: $ ("[নাম = সিএসআরএফ-টোকেন]") ব্যবহার করুন instead পরিবর্তে অ্যাটর ("সামগ্রী")। এটি নামের অ্যাট্রিবিউট দ্বারা সঠিক উপাদান আনবে।
পেড্রো

4
কেবলমাত্র ডেটা ফিল্ডে বিজ্ঞাপন দেওয়া সম্ভব: ডেটা: to "_ টোকেন": "{s csrf_token ()}}" // সিএসআরএফসফরেন ()},
মার্টিন হার্টম্যান

3

আপনি যদি এজেএক্স পোস্ট প্রেরণ করতে jQuery ব্যবহার করে থাকেন, সমস্ত কোডে এই কোডটি যুক্ত করুন:

$( document ).on( 'ajaxSend', addLaravelCSRF );

function addLaravelCSRF( event, jqxhr, settings ) {
    jqxhr.setRequestHeader( 'X-XSRF-TOKEN', getCookie( 'XSRF-TOKEN' ) );
}

function getCookie(name) {
    function escape(s) { return s.replace(/([.*+?\^${}()|\[\]\/\\])/g, '\\$1'); };
    var match = document.cookie.match(RegExp('(?:^|;\\s*)' + escape(name) + '=([^;]*)'));
    return match ? match[1] : null;
}

লারাভেল সমস্ত অনুরোধে একটি এক্সএসআরএফ কুকি যুক্ত করে এবং আমরা জমা দেওয়ার ঠিক আগে সমস্ত অ্যাজেএক্স অনুরোধগুলিতে স্বয়ংক্রিয়ভাবে এটিকে যুক্ত করি।

একই জিনিসটি করার জন্য যদি অন্য কোনও ফাংশন বা jQuery প্লাগইন থাকে তবে আপনি getCookie ফাংশন প্রতিস্থাপন করতে পারেন।


2

@ প্রদীপ সায়নী @ গৃহীত উত্তর নিয়ে কখনই সমস্যা হচ্ছে, মুছে ফেলার চেষ্টা করুন

cache:false,
processData:false,
contentType:false,

এজ্যাক্স কলের জন্য।

ব্যবহার

dataType:"json",

1

লারাভেল ৫.৮-এর জন্য, আপনার লেআউটের জন্য সিএসআরএফ মেটা ট্যাগ সেট করা এবং এজ্যাক্স সেটিংসে সিএসআরএফের জন্য অনুরোধ শিরোনাম নির্ধারণ করা যদি আপনি অজ্যাক্সটি ইতিমধ্যে একটি ফর্ম জমা দেওয়ার জন্য ব্যবহার করেন তবে কাজ করবে না _token ইঞ্জিন দ্বারা উত্পন্ন ইনপুট ক্ষেত্র ।

আপনার এজাক্স অনুরোধের সাথে ফর্মটি থেকে ইতিমধ্যে উত্পাদিত সিএসআরএফ টোকেন অবশ্যই আপনাকে অন্তর্ভুক্ত করতে হবে কারণ সার্ভারটি এটি আশা করবে এবং এটি আপনার মেটা ট্যাগের নয়।

উদাহরণস্বরূপ, _tokenব্লেড দ্বারা উত্পন্ন ইনপুট ক্ষেত্রটি এরকম দেখাচ্ছে:

<form>
    <input name="_token" type="hidden" value="cf54ty6y7yuuyyygytfggfd56667DfrSH8i">
    <input name="my_data" type="text" value="">
    <!-- other input fields -->
</form>

তারপরে আপনি এইভাবে এজাক্স সহ আপনার ফর্মটি জমা দিন:

<script> 
    $(document).ready(function() { 
        let token = $('form').find('input[name="_token"]').val();
        let myData = $('form').find('input[name="my_data"]').val();
        $('form').submit(function() { 
            $.ajax({ 
                type:'POST', 
                url:'/ajax', 
                data: {_token: token, my_data: myData}
                // headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')}, // unnecessary 
                // other ajax settings
            }); 
            return false;
        }); 
    }); 
</script>

মেটা শিরোনামে সিএসআরএফ টোকেন কেবল তখনই কার্যকর যখন আপনি ফলক উত্পন্ন _tokenইনপুট ক্ষেত্রটি ছাড়াই কোনও ফর্ম জমা দিচ্ছেন ।


1

আপনার সেশনটির মেয়াদ শেষ হলে আপনি আবার লগইন করতে এটি ব্যবহার করতে পারেন

$(document).ajaxComplete(function(e, xhr, opt){
  if(xhr.status===419){
    if(xhr.responseJSON && xhr.responseJSON.message=='CSRF token mismatch.') window.location.reload();
  }
});

0

আমার আসলে এই ত্রুটি ছিল এবং কোনও সমাধান খুঁজে পেলাম না। আমি আসলে একটি এজ্যাক্স অনুরোধ না করে শেষ করেছি। আমি জানি না যে এই সমস্যাটি আমার সার্ভারে সাব ডোমেন হওয়ার কারণে বা কী কারণে হয়েছিল। এখানে আমার jquery।

            $('#deleteMeal').click(function(event) {
                var theId = $(event.currentTarget).attr("data-mealId");
                  $(function() {
                    $( "#filler" ).dialog({
                      resizable: false,
                      height:140,
                      modal: true,
                      buttons: {
                      "Are you sure you want to delete this Meal? Doing so will also delete this meal from other users Saved Meals.": function() {
                           $('#deleteMealLink').click();
//                         jQuery.ajax({
//                              url : 'http://www.mealog.com/mealtrist/meals/delete/' + theId,
//                              type : 'POST',
//                              success : function( response ) {
//                                  $("#container").replaceWith("<h1 style='color:red'>Your Meal Has Been Deleted</h1>");
//                              }
//                          });
                        // similar behavior as clicking on a link
                           window.location.href = 'http://www.mealog.com/mealtrist/meals/delete/' + theId;
                          $( this ).dialog( "close" );
                        },
                        Cancel: function() {
                          $( this ).dialog( "close" );
                        }
                      }
                    });
                  });
                });

সুতরাং আমি আসলে কোনও পোস্ট রিকোয়েস্ট না করে আমার এপিআইতে যাওয়ার জন্য একটি অ্যাঙ্কর সেটআপ করেছি, যা আমি বেশিরভাগ অ্যাপ্লিকেশনকেই দেখি।

  <p><a href="http://<?php echo $domain; ?>/mealtrist/meals/delete/{{ $meal->id }}" id="deleteMealLink" data-mealId="{{$meal->id}}" ></a></p>

0

ফর্মটিতে আপনার কোনও লুকানো সিএসআরএফ (ক্রস সাইট অনুরোধ জালিয়াতি) টোকেন ক্ষেত্র অন্তর্ভুক্ত করা উচিত যাতে সিএসআরএফ সুরক্ষা মিডলওয়্যার অনুরোধটিকে বৈধতা দিতে পারে।

লারাভেল অ্যাপ্লিকেশন দ্বারা পরিচালিত প্রতিটি সক্রিয় ব্যবহারকারী সেশনের জন্য স্বয়ংক্রিয়ভাবে একটি সিএসআরএফ "টোকেন" উত্পন্ন করে। এই টোকেনটি যাচাই করতে ব্যবহার করা হয় যা সত্যায়িত ব্যবহারকারী হ'ল আবেদনের কাছে অনুরূপ অনুরোধ করছে।

সুতরাং এজাক্স অনুরোধগুলি করার সময়, আপনাকে ডাটা প্যারামিটারের মাধ্যমে সিএসআরএফ টোকেনটি পাস করতে হবে । এখানে নমুনা কোড।

var request = $.ajax({
    url : "http://localhost/some/action",
    method:"post",
    data : {"_token":"{{ csrf_token() }}"}  //pass the CSRF_TOKEN()
  });

0

আমি কেবল ফর্মের অভ্যন্তরীণ @ csf ব্যবহার করি এবং এটির কাজ ঠিক আছে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.