2012-06-29 14 views
5

मैं अपने नियंत्रक में कुछ डेटा पास करने का प्रयास कर रहा हूं, लेकिन मुझे 500 त्रुटि मिल रही है। कुछ शोध के बाद, मैंने पाया कि यह सीएसआरएफ टोकन भेजा नहीं जा रहा है।कोडनिर्देशक से सीएसआरएफ को AJAX डेटा में कैसे शामिल करें

ऐसा लगता है जैसे मैं डेटा के साथ इस शामिल करने की जरूरत: <?php echo $this->security->get_csrf_token_name(); ?>:"<?php echo $this->security->get_csrf_hash(); ?>"

मेरे जे एस सुंदर कमजोर है, तो मैं एक छोटे से यह कैसे को बदलने के लिए ऊपर शामिल करने पर संदेह में हूँ।

<script type="text/javascript"> 
$(document).ready(function() { 
    $("#order").sortable({ 
     update : function (event, ui) { 
      order = $('#order').sortable('serialize'); 
      $.ajax({ 
       url: "<?=base_url().'admin/category/update_order'?>", 
       type: "POST", 
       data: order, 
       success: function(response){ 
        console.log(response); 
       } 
      }); 
     } 
    }); 
} 
); 
</script> 

उत्तर

3

टोकन $.ajax की data दिया गया तर्क की जरूरत है।

यह काम करना चाहिए लेकिन नीचे मेरे नोट देखें।

order['<?php echo $this->security->get_csrf_token_name(); ?>'] = '<?php echo $this->security->get_csrf_hash(); ?>';

हालांकि, वहाँ कुछ बुरा यहाँ पर जा रहा अभ्यास दिए गए हैं। मुख्य रूप से आपको अपने जावास्क्रिप्ट में PHP का उपयोग नहीं करना चाहिए क्योंकि यह आपको जावास्क्रिप्ट को एक अलग फ़ाइल के रूप में एक्सेस करने में सक्षम होने से रोकता है (यह अच्छा है क्योंकि ब्राउज़र इसे आपके पृष्ठ को तेज़ी से लोड करने और कम बैंडविड्थ का उपभोग करने के लिए कैश करेगा)।

यह इस तरह अपने आदेश <form> html में टोकन संगृहीत करने से बेहतर है ..

<input type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash(); ?>" />

तो यह आपके प्रपत्र डेटा के साथ धारावाहिक मिल जाएगा।

आप यूआरएल को फॉर्म की एक्शन विशेषता में भी स्टोर कर सकते हैं। यह मदद मिलेगी अपनी स्क्रिप्ट शान से नीचा है और यह भी यूआरएल $.ajax कॉल में की 2.

<form id="order" method="post" action="<?=base_url()?>admin/category/update_order"> 

बजाय एक ही स्थान पर रहता है, का उपयोग इस url: $('#order').attr('action'), संभालने #order की तरह कुछ वास्तविक रूप आईडी है।

+0

क्षमा करें, मैं इस को शामिल नहीं किया, लेकिन लिपि एक फॉर्म का उपयोग नहीं करता है। यह प्रत्येक स्थिति परिवर्तन पर एक सूची में पुन: व्यवस्थित आइटम है। मुझे यकीन है कि यह आसान होगा जब मैं उनका उपयोग करता हूं। धन्यवाद! – Motive

+0

आह मैं देखता हूँ। एक PHP + जेएस समाधान में संपादित। – jchook

1

आप सही हैं, बस अपने पोस्ट डेटा में सीएसआरएफ टोकन जोड़ें। आप इस तरह, अपने आदेश वस्तु आप पहले से ही CSRF टोकन डेटा के साथ बनाया विलय करने के लिए jQuery के $ .extend फ़ंक्शन का उपयोग कर सकते हैं:

$.extend(alerts, { 
'<?php echo $this->security->get_csrf_token_name(); ?>' : 
'<?php echo $this->security->get_csrf_hash(); ?>' }); 
0

मैं MY_form_helper.php रूप form_helper का विस्तार अपने खुद के रूप पीढ़ी कोड के लिए CSRF टोकन सेवा करने के लिए - आप कुछ इसी तरह इस्तेमाल कर सकते हैं:

function secure_form() { 
     $CI =& get_instance(); 
     return '<input type="hidden" name='.$CI->security->get_csrf_token_name().' value='.$CI->security->get_csrf_hash().'>'; 
    } 
2

सीआई भंडार कुकी में CSRF और आप उसे वहां से लाने के कर सकते हैं:

var csrf = $.cookie('csrf_cookie_name'); 

इस विधि का नकारात्मक पक्ष यह है कि jQuery मूल रूप से कुकी एक्सेस प्रदान नहीं करता है। तो आपको jquery plugin की आवश्यकता होगी।

0

एक और समाधान .serialize() का उपयोग करने के लिए है:

$.post("user/save", $('#frmUser').serialize(),function(html){ 
     $("#results").html(html); 
}); 

कि छिपी हुई फ़ील्ड कि CSRF डेटा संग्रहीत करता मिल जाएगा।

1

यहां एक अलग दृष्टिकोण है। Auth.php में सरल फ़ंक्शन जो JSON प्रारूप में csrf टोकन नाम और हैश देता है।फिर, हमारे जावास्क्रिप्ट में, दो AJAX कॉल करें, सीएसआरएफ क्रेडिट को पकड़ने वाले पहले और उन्हें छिपे हुए फॉर्म फ़ील्ड में डालें, दूसरा हमारे वास्तविक फॉर्म को संभालने के लिए दूसरा। Auth.php नियंत्रक में

// जगह समारोह

public function get_csrf() 
{ 
    $csrf['csrf_name'] = $this->security->get_csrf_token_name(); 
    $csrf['csrf_token'] = $this->security->get_csrf_hash(); 

    echo json_encode($csrf); 
} 

// myfunction()

<script type="text/javascript"> 
function myFunction() { 

    // first ajax call to grab the csrf name and token 
    // from our get_csrf() function in Auth.php 
    $.ajax({ 
     type: "GET", 
     dataType: 'json', 
     url: "https://<your_domain>.com/auth/get_csrf", //replace with your domain 
     success: function (data) { 

      // assign csrf name and token to variables 
      csrf_name = data.csrf_name; 
      csrf_token = data.csrf_token; 

      // assign field1 and field2 field values to variables 
      var form_field1 = document.getElementById('field1').value; 
      var form_field2 = document.getElementById('field2').value; 

      // insert csrf creds into form 
      $('#csrftoken').attr('name', csrf_name); 
      $('#csrftoken').val(csrf_token); 

      // second ajax call -- this is our form handler 
      $.ajax({ 
       type: "POST", 
       url: "https://<your_domain>.com/<your_controller>/<your_function>", //replace with your domain/controller/function 
       data: { 
        // ES6 computed property keys are great... 
        [csrf_name] : csrf_token, 
        "field1" : form_field1, 
        "field2" : form_field2 
         }, 
       success: function(data) { 

        // handle the return from your form submit 
        if (data == "ok") { 
         console.log("Success!"); 
         $("#infoMessage").html("<p>Success</p>").fadeIn(300); 

        } else { 

         console.log("Oops!"); 
         $("#infoMessage").html("<p>Oops!</p>"); 

        } 

       } 
      }); 

     } 
    }); 

} 
</script> 

// एचटीएमएल

<div id="infoMessage"></div> 

<form method="post" accept-charset="utf-8"> 

    <input type="hidden" id="csrftoken" name="" value="" /> 

    <label for="field1">Field 1:</label> <br /> 
    <input type="text" name="field1" id="field1" /> 

    <label for="field2">Field 2:</label> <br /> 
    <input type="text" name="field2" id="field2" /> 

    <input type="button" name="submit" value="SUBMIT" onclick="myFunction()" /> 

</form> 
संबंधित मुद्दे