2009-08-28 13 views
8

पर टोकन मैं वर्तमान में एएसपीनेट में एक एमवीसी अनुप्रयोग विकसित कर रहा हूं। मैं रिकॉर्ड की सूची में एक डिलीट लिंक प्रदान करने के लिए AJAX.ActionLink का उपयोग कर रहा हूं, हालांकि यह बहुत असुरक्षित है। मैं इस डाल दिया है:एएसपीनेट एमवीसी एंटीफोर्गेरी एजेक्स

<AcceptVerbs(HttpVerbs.Post)> 

समारोह से अधिक हटाने, जो समारोह बस एक यूआरएल द्वारा बुलाया जा रहा है बंद हो जाता है क्या करना है।

<form action="http://foo.com/user/delete/260" method="post"> 
<input type="submit" /> 
</form> 

यह अभी भी एक पोस्ट perfoming किया जाएगा, लेकिन किसी अन्य स्थान से: हालांकि, अन्य सुरक्षा छेद अभी भी मौजूद है कि कि इस सामग्री के साथ एक बुनियादी html पृष्ठ बनाने के लिए अगर मैं थे।

क्या एंजैक्स एक्शनलिंक के साथ एंटीफोर्गेरी टोकन का उपयोग करना संभव है? यदि हां, तो क्या यह एक सुरक्षित दृष्टिकोण है? क्या मुझे और सुरक्षा सुरक्षा छेद नहीं मिली है?

उत्तर

2

मुझे विशेष रूप से AJAX एक्शनलिंक के बारे में पता नहीं है, लेकिन यह वेबफॉर्म पेज से [AcceptVerbs(HttpVerbs.Post), ValidateAntiForgeryToken] विशेषताओं के साथ एक एमवीसी क्रिया में पोस्ट करना संभव है।

आप एमवीसी सत्यापन के लिए उपयोग की जाने वाली कुकी और मेल खाने वाले फॉर्म इनपुट को सेट करने के लिए उपयोग की जाने वाली एमवीसी विधियों को प्राप्त करने के लिए प्रतिबिंब का उपयोग कर सकते हैं। Using an MVC HtmlHelper from a WebForm

9

इस blog post पर एक नज़र डालें। ,

$.post('/home/DeleteAccount', { accountId: 1000 }, function() { alert('Account Deleted.'); });

के बाद से पोस्ट AntiForgeryToken शामिल नहीं है:

आप इस तरह एक कार्य विधि है कहते हैं:

[AcceptVerbs(HttpVerbs.Post), ValidateAntiForgeryToken] public ActionResult DeleteAccount(int accountId) { // delete stuff }

और आप के माध्यम से इसे कहते यह असफल हो जाएगा।

सौभाग्य से, इसे ठीक करने के लिए दिमागी शक्ति नहीं लेती है। एंटीफोर्गेरी टोकन के सभी क्लाइंट साइड घटक को मूल छिपे हुए फ़ील्ड में टोकन डाल दिया जाता है। तो, आपको बस की आवश्यकता है कि उस डेटा को खींचें और इसे में अपने AJAX कॉल में शामिल करें।

var token = $('input[name=__RequestVerificationToken]').val();

$.post('/home/DeleteAccount', { accountId: 1000, '__RequestVerificationToken': token }, function() { alert('Account Deleted.'); });

ध्यान दें कि यदि आप कई AntiForgeryTokens साथ पृष्ठ पर एकाधिक रूपों है, तो आप करना होगा निर्दिष्ट सकें कि आप अपनी jQuery चयनकर्ता में चाहते हैं। एक और पकड़ लिया है, तो आप jQuery के serializeArray() समारोह का उपयोग कर रहे हैं, आप इसे थोड़ा अलग जोड़ने के लिए होगा है:

var formData = $('#myForm').serializeArray(); var token = $('input[name=__RequestVerificationToken]').val(); formData.push({ name: '__RequestVerificationToken', value: token });

$.post('/home/DeleteAccount', formData, function() { alert('Account Deleted.'); });

अद्यतन: लिंक तय किया गया है।

+1

कि लिंक के मृत – Keith

+0

आप की जरूरत नहीं है formData.push ({नाम: '__RequestVerificationToken', मूल्य: टोकन}); चूंकि serializeArray() फॉर्म में सभी इनपुट लौटाएगा, जिसमें __RequestVerificationToken छिपे हुए फ़ील्ड शामिल हैं। –

+0

हां आपको AJAX पोस्ट पर इसकी आवश्यकता है (वर्तमान एमवीसी 4 और एमएस unobtrusive AJAX = jQuery का उपयोग कर) !!! –

0

मैंने किसी भी AJAX मददगार का उपयोग नहीं किया है, लेकिन मुझे कोई कारण नहीं दिख रहा है कि आप एक लिंक का उपयोग क्यों नहीं कर सकते हैं। व्यक्तिगत रूप से मैं एक ऑनलोड इवेंट हैंडलर का उपयोग स्वयं से फ़ॉर्म से एक लिंक बनाने के लिए करता हूं, और फिर फॉर्म को हटा देता हूं।

6

आप Ajax.ActionLink साथ AntiForgeryToken उपयोग कर सकते हैं लेकिन आप मैन्युअल रूप से तो जैसे आपके अनुरोध के शीर्षक में AntiForgeryToken डालने की आवश्यकता:: फिर

function GetAntiForgeryToken(){ 
    var tokenWindow = window; 
    var tokenName = "__RequestVerificationToken"; 
    var tokenField = $(tokenWindow.document).find("input[type='hidden'][name='" +  tokenName + "']"); 
    if (tokenField.length == 0) {return null;} 
    else { 
     return { 
     name: tokenName, 
     value: tokenField.val() 
     }; 
    } 
}; 

, हम उपयोग कर सकते हैं

इस उत्तर देखें $ .ajaxPrefilter हैडर में डालने के लिए:

$.ajaxPrefilter(
    function (options, localOptions, jqXHR) { 
     var token = GetAntiForgeryToken(); 
     jqXHR.setRequestHeader(token.name, token.value); 
    } 
); 

मैं इसे here बारे में एक पोस्ट में लिखा था। उम्मीद है की यह मदद करेगा!

+0

यह हेडर में टोकन भेजता है, लेकिन [ValidateAntiForgeryToken] फ़िल्टर को फ़ॉर्म डेटा में इसकी आवश्यकता होती है ... – iGanja

6

उपयोग Ajax.ActionLink

इसके अलावा साथ jjwhite01 जवाबी कार्रवाई के लिए AntiForgeryToken; , प्रपत्र डेटा का टोकन डालने prefilter में option.data उपयोग करने के लिए

$.ajaxPrefilter(
    function (options, localOptions, jqXHR) { 
     if (options.type !== "GET") { 
      var token = GetAntiForgeryToken(); 
      if (token !== null) { 
       if (options.data.indexOf("X-Requested-With") === -1) { 
        options.data = "X-Requested-With=XMLHttpRequest" + (options.data === "") ? "" : "&" + options.data; 
       } 
       options.data = options.data + "&" + token.name + '=' + token.value; 
      } 
     } 
    } 
); 
+1

एमवीसी 4 में अविभाज्य AJAX स्क्रिप्ट में शामिल हैं - options.data.push ({name: "X-Requested-with ", मान:" XMLHttpRequest "}) - इसलिए इसके लिए जांच और जोड़ना अब अनावश्यक है – Brent

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