我一直在浏览开发项目的错误日志,发现以下错误(更改名称以保护有罪的无辜者) -
提供的防伪令牌适用于用户"",但当前用户为"admin".
这不是一个特别难以复制的问题 -
堆栈跟踪是 -
System.Web.Mvc.HttpAntiForgeryException(0x80004005):提供的防伪令牌适用于用户"",但当前用户为"admin".在System.Web.Helpers.AntiForgery的System.Web.Helpers.AntiXsrf.TokenValidator.ValidateTokens(HttpContextBase httpContext,IIdentity identity,AntiForgeryToken sessionToken,AntiForgeryToken fieldToken)中的System.Web.Helpers.AntiXsrf.AntiForgeryWorker.Validate(HttpContextBase httpContext).在System.Web.Mvc.Mvc.Asvoke.Av响应(SystemContext控件),System.Web.Mvc.AsvokeAuthorizationFilters(ControllerContext controllerContext,IList`1过滤器,ActionDescriptor actionDescriptor)的System.Web.Mvc.ValidateAntiForgeryTokenAttribute.OnAuthorization(AuthorizationContext filterContext)中验证(),System.Web.Mvc.Async.AsyncControllerActionInvoker. <> c__DisplayClass25.
登录方法签名是 -
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
...
}
Run Code Online (Sandbox Code Playgroud)
这与互联网"ASP.NET MVC 4 Web应用程序"模板化项目中的方法签名完全相同,这表明Microsoft认为ValidateAntiForgeryToken是必要/最佳实践,或者只是在此处添加了属性,因为它已被使用在其他地方.
显然,我无法在此方法中处理问题,因为它没有到达,ValidateAntiForgeryToken是一个预请求过滤器,它在阻止请求到达控制器之前.
在提交表单之前,我可以检查用户是否通过Ajax进行了身份验证,如果是,则尝试重定向到这些用户,或者只是删除该属性.
问题是这个 - 我理解该令牌的设计是为了防止来自另一个站点(CSRF)的请求,当用户已经针对您的站点进行了身份验证时,所以基于这个问题将它从表单中删除是一个问题,根据定义将使用它未经验证的用户?
据推测,此实例中的属性旨在缓解为您的应用程序提供虚假登录表单的恶意行为者(尽管在抛出异常时可能已经输入了他或她已经记录的详细信息 - 但它可能会提醒他们某些事情是错的).否则,从外部站点向表单提交不正确的凭据将导致与站点本身完全相同的结果?我不依靠客户验证/卫生来清理可能不安全的输入.
让其他开发人员遇到此问题(或者我们是否拥有异常富有创意的用户)如果是这样,您如何解决/减轻它?
更新:此问题在MVC5中仍然存在,完全是故意的,现在出现错误消息"提供的防伪令牌是针对与当前用户不同的基于声明的用户".使用默认模板和身份提供程序时.Microsoft Developer Evangelist和Troy的同事PluralSight作者Adam Tuliper在登录页面上的Anti forgery 令牌中提出了一个相关的问题和有趣的答案,建议只需删除令牌.
ASP.NET MVC 2的请求验证是否已更改,更准确地说,未验证?
我做了以下事情:
Web.configs(在App目录和Views目录中)
<pages
validateRequest="false"
Run Code Online (Sandbox Code Playgroud)
控制器/动作属性
[ValidateInput(false)]
Run Code Online (Sandbox Code Playgroud)
在@Page View Directive中
ValidateRequest="false"
Run Code Online (Sandbox Code Playgroud)
页面仍然有效,发布HTML内容时会引发异常.
UPDATE
创建了一个新的ASP.NET MVC 2应用程序,我修改了Home Controller的索引
[ValidateInput(false)]
public ActionResult Index(string InputText)
{
ViewData["Message"] = "Welcome to ASP.NET MVC!";
return View();
}
Run Code Online (Sandbox Code Playgroud)
和我的视图页面
<% using(Html.BeginForm()){ %>
<%= Html.TextBox("InputText") %>
<input type="submit" />
<% } %>
Run Code Online (Sandbox Code Playgroud)
仍然是同一个问题,抛出异常.
我们刚刚升级到ASP.NET 4.0,发现requestValidation不再有效.MSDN文档建议我们需要将web.config中的requestValidationMode设置为2.0:
- 4.0(默认值).HttpRequest对象在内部设置一个标志,指示每当访问任何HTTP请求数据时都应触发请求验证.这保证了在请求期间访问诸如cookie和URL之类的数据之前触发请求验证.将忽略配置文件中的pages元素(如果有)或单个页面中的@ Page指令的请求验证设置.
- 2.0.仅对页面启用请求验证,而不是对所有HTTP请求启用.此外,配置文件中的pages元素(如果有)或单个页面中的@ Page指令的请求验证设置用于确定要验证的页面请求.
这对我们有用,但我有点困惑.似乎我们将其置于传统/兼容模式.当然应该可以有4.0行为,但仍然可以选择在页面上关闭它?
我们为ASP.NET抛出的异常配置了以下自定义错误页面:
<customErrors mode="On" redirectMode="ResponseRewrite">
<error statusCode="400" redirect="~/400.aspx"/>
<error statusCode="404" redirect="~/404.aspx"/>
<error statusCode="500" redirect="~/500.aspx"/>
</customErrors>
Run Code Online (Sandbox Code Playgroud)
设置redirectMode="ResponseRewrite"很重要,因为它确保URL不会更改(我相信ASP.NET执行Server.Transfer而不是Response.Redirect).
不幸的是,这不适用于请求验证错误.例如,如果我导航到/some/page/<script>ASP.NET的请求验证启动并且HttpException抛出了a,则启用自定义错误.但是,我没有显示自定义错误页面,而是收到以下消息:
'/'应用程序中的服务器错误.
运行时错误
描述:处理您的请求时发生异常.此外,执行第一个异常的自定义错误页面时发生另一个异常.请求已终止.
为什么ASP.NET无法在此方案中显示我的自定义错误页面?错误页面中没有代码,只有HTML,所以我知道错误页面本身不会抛出任何异常.
此外,如果我自己捕获错误Application_Error并发出Server.Transfer它工作正常,所以我很好奇ASP.NET正在做什么.
如果我们要自己解决这个问题,那么有更好的解决方案吗?
protected void Application_Error(object sender, EventArgs e)
{
var ex = Server.GetLastError() as HttpException;
if (ex != null
&& ex.Message.StartsWith("A potentially dangerous Request.Path value was detected from the client")
&& HttpContext.Current.IsCustomErrorEnabled)
{
Server.Transfer("400.aspx");
}
}
Run Code Online (Sandbox Code Playgroud) 我遇到了包含"危险字符"作为Web API URL一部分的请求的问题.Url包含一个正确的Url编码的&,但仍会导致请求验证ASP.NET错误.
与MVC不同,似乎没有[ValidateInput(false)]属性来强制和禁用此功能.
我试图通过执行以下操作关闭控制器中所有操作方法的请求验证:
[ValidateInput(false)]
public class MyController : Controller
{
...
Run Code Online (Sandbox Code Playgroud)
我正在使用的参考说这是可能的,并告诉我这样做,但由于某种原因,它不起作用.
如果我通过文本框提交任何html(甚至是简单的<b>标签),我会收到错误消息:
从客户端检测到一个潜在危险的Request.Form值(text = <b>").
通过将属性附加到单个方法也无法正常工作.
如何禁用控制器的请求验证?
我在VS2008内置测试服务器.
我的问题很有希望.提交表单后,我想将包含无效字符(特别是HTML)的所有属性(字段)标记为模型错误.我面临的问题是请求验证在模型绑定/验证之前启动并且我获得了HTTP 500 ...我看到了一个类似的问题,它[AllowHtml]在Model/ViewModel上使用属性属性或<httpRuntime requestValidationMode="2.0" />在web.config中使用属性属性 ,但是我在我正在寻找的是如何" 全局捕获请求验证异常并将其显示为模型错误 ".此外,我不想"剥离"HTML标签,我想通知用户他们的输入无效.
我想过使用正则表达式验证属性来查找错误的输入,但正如我所提到的,ASP.NET MVC3上的请求验证发生在模型绑定/验证之前,所以这是不行的...
所以我正在尝试为内部项目开发一个rest API,我遇到了一个问题,当表单请求验证失败时,它会显示@index响应.
所以我有两条路线;
Route::get('/api/clients', 'ClientController@index');
Route::post('/api/clients', 'ClientController@store');
Run Code Online (Sandbox Code Playgroud)
@index列出所有客户端,@store创建一个新客户端,我在方法上有一个表单请求验证器,@store它检查为客户端提供的名称.
我想要的是当验证器失败时,它会显示带有验证错误的JSON响应.但我认为它发生的是验证失败,因此它重定向回同一页面,但重定向GET不是POST,所以它列出了所有客户端.
我知道你可以设置你的标题,使它看起来像一个ajax请求,它将正确显示JSON响应,但我希望它显示JSON响应,无论它是否是ajax.
我已经尝试覆盖response我的验证器中的方法,该方法不起作用,我已经尝试wantsJson在验证器中设置方法以返回true,这再次无效.
非常感谢帮助.
代码如下......
web.php
Route::get('/api/clients', 'ClientController@index');
Route::get('/api/clients/{client}', 'ClientController@show');
Route::post('/api/clients', 'ClientController@store');
Route::put('/api/clients/{id}', 'ClientController@update');
Route::delete('/api/clients/{id}', 'ClientController@delete');
Run Code Online (Sandbox Code Playgroud)
ClientController.php
namespace App\Http\Controllers;
use App\Client;
use App\Http\Requests\ClientRequest;
class ClientController extends Controller
{
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(ClientRequest $request)
{
return Client::create([
'title' => request('title'),
'user_id' => auth()->id() …Run Code Online (Sandbox Code Playgroud) 此处已针对先前版本的 laravel提出了该问题,但尚未回答。
我有一个html form使用三个不同的Form Request Validations. 我有能力做到这一点。但是,问题是,表单验证是一一进行的。不是同时。
如果第一个表单请求引发验证错误,则该表单将返回给view其余的两个表单,因此不会评估,因此无法向用户显示正确的验证错误。
我要的是:验证表单与三个表单验证请求rules在同一时间。
控制器:
public function store(TransportationRequest $request1, PurchaseRequest $request2, SaleRequest $request3)
{
//do actions here
}
Run Code Online (Sandbox Code Playgroud)
我试过一一继承表单请求,但没有成功。
编辑 :
更具体地说明我的问题:
我有三个独立的形式purchase,transporataion以及sale其使用单独计价PurchaseRequest,TransportationRequest并且SaleRequest对单个操作。
但是有一个特殊情况,在一个单一的形式处理一个purchase,transporataion和一个sale。我想使用组合三个表单请求规则来验证表单,因为我不想再次编写相同的验证规则。
这个
注意:单独表格和组合表格中的字段相同。
谢谢..
可以提交跨站点脚本(XSS)模式.
[HttpPost]
[AllowAnonymous]
[ValidateInput(false)]
public async Task<string> Index(string Xml) => await Process(Xml);
Run Code Online (Sandbox Code Playgroud)
如果我删除ValidateInput(false)Tag它会抛出异常."潜在的危险......"
Web.config设置如下
<httpRuntime targetFramework="4.6.1" requestValidationMode="2.0" />
Run Code Online (Sandbox Code Playgroud)
传入的请求将始终具有XML字符串.
是否有任何属性或某些东西不需要添加validateInput(False)并允许XMl.
请为您提供意见.
先感谢您.
security xss request-validation asp.net-mvc-validation client-side-attacks
asp.net ×3
asp.net-mvc ×3
.net ×2
c# ×2
laravel ×2
asp.net-4.0 ×1
json ×1
laravel-5.5 ×1
php ×1
security ×1
validation ×1
xss ×1