2010-04-20 76 views
151

我有一个使用ckeditor的表单。这种形式在Asp.Net 2.0和3.5中运行良好,但现在它在Asp.Net 4+中不起作用。我有ValidateRequest =“false”指令。有什么建议么?ValidateRequest =“false”在Asp.Net中不起作用4

+0

有有关呈现验证的短文章控制得宜,如果有人关心:[错误在.NET中验证4](http://www.softcircuits.com/Blog/post/2010/06/04/Validation-Controls -Lost-Their-Red-Color.aspx) – Ian 2010-06-15 00:16:39

+0

任何人都可以请让我知道使用ValidationRequest = false有什么缺点? – fc123 2014-10-16 16:04:12

回答

186

在错误页面找到解决方案。只是需要加入requestValidationMode = “2.0”

<system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    <httpRuntime requestValidationMode="2.0" /> 
</system.web> 

MSDN信息:HttpRuntimeSection.RequestValidationMode Property

+1

这真棒,但有谁知道一种方法来设置每页?另外我怎么把它放在web.config中,以便它仍然可以与.NET 2一起使用? – 2010-06-18 20:43:05

+1

@MK:我不认为这个设置有页面指令。你不能让它在.net 2上运行。我不认为这是必要的。因为您可以构建仅针对一个框架版本的Web应用程序。只需将此行复制到需要它的.net 4 web.config ... – 2010-06-18 23:23:10

+2

但是.net 4的验证中发生了什么变化?有没有办法做到这一点,而不改变验证模式? – Sly 2010-12-10 14:12:00

94

有办法把验证回到2.0一页。只需将下面的代码添加到您的web.config:

<configuration> 
    <location path="XX/YY"> 
     <system.web> 
      <httpRuntime requestValidationMode="2.0" /> 
     </system.web> 
    </location> 

    ... 
    the rest of your configuration 
    ... 

</configuration> 
+0

它也适用于文件夹吗? – 2011-05-27 10:11:55

+0

位置是任何路径,并且基于您在树中指定的文件夹下的任何节点。 – DFTR 2011-10-24 23:04:43

+6

这是比接受的答案更好的解决方案,因为它不是应用程序范围,而是狭窄到您在位置路径中定义的特定范围 – 2013-02-13 00:43:30

26

此工程在不改变验证模式。

您必须使用System.Web.WebPages.dllSystem.Web.Helpers.Validation.Unvalidated帮手。它将返回一个UnvalidatedRequestValues对象,该对象允许在不验证的情况下访问表单和QueryString。

例如,

var queryValue = Server.UrlDecode(Request.Unvalidated("MyQueryKey")); 

作品对我来说MVC3和.NET 4

+1

您能否提供一个如何使用此方法检索queryString的示例?我一直得到'未经验证不是...的成员',我尝试将其附加到所有对象。我想我可能会缺少包括 – CodedMonkey 2012-05-23 21:04:03

+3

var queryValue = Server.UrlDecode(Request.Unvalidated(“MyQueryKey”)); – sfuqua 2012-05-23 21:12:50

+1

这绝对应该是被接受的答案。保持安全性并且非常灵活,因为您可以选择性地使用它。 – cmartin 2015-06-05 18:38:48

14

注意,另一种方法是保持与4.0验证行为,而是定义自己的类派生自RequestValidator并设置:

<httpRuntime requestValidationType="YourNamespace.YourValidator" /> 

(其中YourNamespace.YourValidator很好,你应该能猜到......)

通过这种方式,您可以保持4.0s行为的优点(具体而言,验证在处理的早期发生),同时还允许您需要通过的请求。

+7

这很好理解。但我仍然认为ASP.Net的整个请求验证功能是错误的。输入本身不是问题,这是你*做的*。接受SQL,HTML或JavaScript代码作为您的应用程序的输入可能非常有效,只要您在输出它或将其存储在数据库中之前对其进行正确编码/转义即可。 – 2012-08-02 17:36:52

+2

@JordanRieger我部分同意。 OOTB,它至少具有默认安全的优点(不要思考问题,并且你会得到错误,而不是错误),但这有点令人讨厌,4.0之前的行为非常全面或无效。 在自定义requestValidationType的情况下,有一些能够在任何其他处理之前获得使用的验证层的能力,但是需要将大量验证与其他处理绑定在一起。总而言之,我认为它更多的是保护一些(但不是全部)分居人士的坏习惯,而不是鼓励良好的习惯。 – 2012-08-02 18:13:47

49

我知道这是一个老问题,但如果你在MVC 3遇到这样的问题,那么你可以装饰你的ActionMethod[ValidateInput(false)],只是关掉请求验证单个ActionMethod,这是很方便的。而且您不需要对web.config文件进行任何更改,因此您仍然可以在其他地方使用.NET 4请求验证。

例如

[ValidateInput(false)] 
public ActionMethod Edit(int id, string value) 
{ 
    // Do your own checking of value since it could contain XSS stuff! 
    return View(); 
} 
+0

这可以在用户控件的Page_Load上完成吗? – 2014-03-20 06:14:11

+1

@RossCooper这只适用于asp.net MVC – mxmissile 2018-02-06 15:07:13

相关问题