2010-04-20 122 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

相關問題