ASP.NET MVC #17
نویسنده: وحید نصیری
تاریخ: ۱۳۹۱/۰۱/۲۹ ۰۸:۲۵:۰۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
A potentially dangerous Request.Form value was detected from the client (Html="<a>").
[HttpPost]
[ValidateInput(false)]
public ActionResult CreateBlogPost(BlogPost post)
using System;
using System.Web.Mvc;
namespace MvcApplication14.Models
{
public class BlogPost
{
public int Id { set; get; }
public DateTime AddDate { set; get; }
public string Title { set; get; }
[AllowHtml]
public string Text { set; get; }
}
}
[RequireHttps]
public ActionResult LogOn()
{
}
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreateBlogPost(BlogPost post)
<input name="__RequestVerificationToken" type="hidden" value="C0iPfy/3T....=" />
[ValidateAntiForgeryToken(Salt="1234")]
@Html.AntiForgeryToken(salt:"1234")
using System.Web.Mvc;
namespace MvcApplication14.CustomFilter
{
public class CheckReferrerAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.HttpContext != null)
{
if (filterContext.HttpContext.Request.UrlReferrer == null)
throw new System.Web.HttpException("Invalid submission");
if (filterContext.HttpContext.Request.UrlReferrer.Host != "mysite.com")
throw new System.Web.HttpException("This form wasn't submitted from this site!");
}
base.OnAuthorization(filterContext);
}
}
}
[HttpPost]
[CheckReferrer]
[ValidateAntiForgeryToken]
public ActionResult DeleteTask(int id)
<system.web>
<httpHandlers>
<add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/>
</httpHandlers>
</system.web>
<system.webServer>
<handlers>
<remove name="BlockViewHandler"/>
<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>
</system.webServer>
public ActionResult Download()
{
return File(Server.MapPath("~/Myfiles/test.txt"), "text/plain");
}
<input name="__RequestVerificationToken" type="hidden" value="C0iPfy/3T....=" />
<>*%&:\?
<httpRuntime requestValidationType="CustomRequestValidation"/>
public class CustomRequestValidation : RequestValidator
{
//...
}سلام؛ در برنامه از DomainLayer, dataLayer استفاده کردم
برای استفاده از AllowHtml و همچنین HiddenInput میبایست فضای System.web.mvc را یوز کنم در حالی که DataLayer من در یک پروژه و Dll مجزا است .
یوز کردن یا Refrence دادن در لایههای دیتا به نیم اسپیس Mvc صحیح است؟ چرا که من تنها نیاز به متادیتای AllowHtml و HiddenInput دارم و همواره در دیتالایر ، نیم اسپیسهای مربوط به EntityFrameWorkو دادها یوز شده.
سلام
من ViewModel استفاده کردم و ViewModelها را هم در یک فایل مجزا و داخل پروژه DataLayer تعریف کرده ام ، با توضیحات شما ViewModel خود یک پروژه مجزا مثل DataLayer بشود، صحیحتر است و یا در خود پروژه اصلی تعریف شود؟
[ValidateAntiForgeryToken(Salt="1234")] @Html.AntiForgeryToken(salt:"1234")
سلام
من مرتبا با خطای AntiForgeryToken مواجه میشم.
یکبار این پیغام صرفا بر روی host ایجاد میشه وگاهی وقتها هم بر روی لوکال. کلیه ورود اطلاعات را با این فیلتر امنیتی مشخص کردم . در اینترنت جستجو کردم و خیلیها این مشکل داشتند و پیشنهاد کردن که در WebConfig نوع الگوریتم و کلید کد و دیکد را مشخص کنم، اما میخواستم بدونم اصلا علت بروز گه گاه این خطا چیست و چرا همیشگی نیست و مشخص کردن کد و الگوریتم کار صحیحی هست یا خیر؟
عنوان خطا: The anti-forgery token could not be decrypted
جزئیات خطا
The anti-forgery token could not be decrypted. If this application is hosted by a Web Farm or cluster, ensure that all machines are running the same version of ASP.NET Web Pages and that the <machineKey> configuration specifies explicit encryption and validation keys. AutoGenerate cannot be used in a cluster Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.Web.Mvc.HttpAntiForgeryException: The anti-forgery token could not be decrypted. If this application is hosted by a Web Farm or cluster, ensure that all machines are running the same version of ASP.NET Web Pages and that the <machineKey> configuration specifies explicit encryption and validation keys. AutoGenerate cannot be used in a cluster.
موارد مشابه در سایر انجمنها : اینجا و اینجا و ...
نتیجه حاصله: درج MachinKey در WebConfig برای مثال:
<system.web> <machineKey validationKey="mykey" decryptionKey="myotherkey" validation="SHA1" decryption="AES" /> </system.web>
var token = $('[name=__RequestVerificationToken]').val();
data.__RequestVerificationToken = token;
...
...
...
$.ajax({
url: url,
type: "POST",
data: data
}); سلام؛ ممنون بابت پاسختون. این طوری به forgeryToken نگاه نکرده بودم.
در صفحه برای Delete و ثبت اطلاعات و یا حتی فیلترکردن اطلاعات و هرجا که کاربر اطلاعاتی وارد میکند از AntiForgeryToken استفاده کردم و حذف و ورود اطلاعات و فیلتر کلا در یک صفحه اما هرکدام در تگ Form مجزایی ارسال و دریافت میشود و در هر تگ Form یک ForgeryToken گذاشتم.
برای اونها چه کار کنم؟ اصلا کار بنده درست بوده؟ من هرکجا کاربر اطلاعاتی وارد کرده از Token استفاده کردم ولی مشکل اینجاست که با توجه به طراحی کل اونها نیازه که در یک صفحه باشه.
می تونم یک AntiForgeryToken کلی داشته باشم و با جاوا اسکریپت اون و بخونم و به Form.Serilaise() اضافه کنم. اما میخواستم راه بهینه اون و بپرسم.
function addToken(data) {
data.__RequestVerificationToken = $("input[name=__RequestVerificationToken]").val();
return data;
}
$.ajax({
// .....
data: addToken({ postId: postId }), // اضافه کردن توکن
dataType: "html", // نوع داده مهم است
// .....
}); filterContext.HttpContext.Request.Unvalidated[key]