Je développe actuellement une application MVC dans ASP.NET. J'utilise Ajax.ActionLinkLink pour fournir un lien Supprimer dans une liste d'enregistrements, mais cela est très peu sûr. J'ai mis ceci: sur la fonction pour faire la suppression, qui arrête la fonction appelée simplement par une URL. Cependant, l'autre trou de sécurité qui existe toujours est que si je devais créer une page HTML de base avec ce contenu: P> <form action="http://foo.com/user/delete/260" method="post">
<input type="submit" />
</form>
6 Réponses :
Regardez sur ce Blog post . P>
dire que vous avez une méthode d'action comme Ceci: p>
[accepter lesverbs (httpverbs.post), Validateanttiforgerytoken] ActionSulte publique Deleteacount (int identifiant de compte) { // Supprimer des trucs} code> p>
Et vous l'appelez via: p>
$. Poste ('/ home / deleteacount', { CompteID: 1000}, fonction () { alerte ("compte supprimé"); }); code> p>
Puisque le post n'inclut pas le Antiforgerytoken, ça échouera. P>
Heureusement, cela ne prend pas beaucoup Brainionne pour résoudre ce problème. Tout le client composant latéral de l'antiforgerytoken est fait le jeton dans une base champ caché. Donc, vous avez juste besoin de Tirez cette donnée et incluez-la dans votre appel AJAX. P>
var jeton = $ ('entrée [nom = __ requestverificationToken]'). val (); code> p>
$. Poste ('/ home / deleteacount', { CompteID: 1000, '__RequestverificationToken': jeton}, fonction() { alerte ("compte supprimé"); }); code> p>
Notez que si vous avez plusieurs Formulaires sur la page avec plusieurs Antiforgerytokens, vous devrez Spécifiez lequel vous voulez dans votre Sélecteur JQuery. Un autre gotcha est si Vous utilisez JQuery's
SERIALIZARRAY () CODE> Fonction, vous aurez Pour l'ajouter un peu différemment: p>
var formdata = $ ('# myform'). Serializarray (); varié jeton = $ ("entrée [nom = __ requestverificationToken] '). Val (); formdata.push ({Nom: '__RequestverificationToken', valeur: jeton}); code> p>
$. poste ('/ home / deleteacount', formdata, fonction () { alerte ("compte supprimé"); }); code> p> blockQuote>
mise à jour: le lien a été corrigé. p>
Vous n'avez pas besoin de formdata.push ({nom: '__requestverificationToken', valeur: jeton}); Étant donné que Serializearray () retournera toutes les entrées sous la forme, qui incluent le champ caché __RequestverificationToke.
Oui, vous en avez besoin sur Ajax Posts (en utilisant actuellement MVC 4 et MS non obstrurlus ajax = jQuery) !!!
Je n'ai utilisé aucun ajout d'ajaxe, mais je ne vois aucune raison pour laquelle vous ne pouvez pas utiliser un lien. Personnellement, j'utiliserais un gestionnaire d'événements surload pour créer de manière discrète un lien de la forme elle-même, puis retirez le formulaire. p>
Je ne connais pas l'ActionLink Ajax Spécifiquement, mais il est possible d'une page WebForms à poster sur une action MVC avec le Vous pouvez utiliser la réflexion pour obtenir les méthodes MVC utilisées pour définir la cookie et l'entrée de formulaire correspondante utilisée pour la validation MVC. P>
Voir cette réponse: L'utilisation d'un MVC HtmlHelper d'un WebForm p> [Acceptverbs.post (httpverbs.post), validateanttiforgeryToken] code> attributs. < / p>
Vous pouvez utiliser AntiforgeryToken avec Ajax.ActionLink, mais vous devez insérer manuellement l'antiforgerytoken dans l'en-tête de votre demande, comme: alors, nous pouvons utiliser $ .ajaxprefilter pour l'insérer. dans l'en-tête: p> J'ai écrit un message à ce sujet
Cela envoie le jeton dans l'en-tête, mais le filtre [ValidAteantAnTIFORGeryToken] nécessite ceci dans les données de formulaire ...
Utilisez AntiforgeryToken avec Ajax.ActionLink Link
En plus de JJwhite01 Strong> Réponse;
Pour insérer le jeton dans les données de formulaire, utilisez option.data code> dans préfiltre p>
Le script Ajax non accidenté en MVC 4 inclut - options.data.push ({nom: "x-demandé-with", valeur: "xmlhttprequest"}) - alors vérifier et ajouter pour cela est maintenant inutile
à piggyback sur le $. Ajaxprefilter CODE> Réponses, j'ai ajouté le jeton aux options code> code> et
originaloptions code> plutôt que le
JQXHR en-têtes. Cela nécessite que le jeton soit quelque part dans une forme sur votre page.
$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
var token = $('input[name="__RequestVerificationToken"]');
if (token.length > 0) {
var data = options.data;
var dataArray = originalOptions.data;
if (data && !data.includes('__RequestVerificationToken')) {
options.data = data + '&__RequestVerificationToken=' + token.val();
}
if (dataArray && !('__RequestVerificationToken' in dataArray)) {
var tokenObject = { name: '__RequestVerificationToken', value: token.val() };
originalOptions.data.push(tokenObject);
}
}
});