2013-02-25 56 views
7

我有MVC副作用

@Html.TextAreaFor(x => x.Text) 

我控制器操作定義在我的強類型查看一個TextArea原本看起來與此類似:

[HttpPost] 
public ViewResult Index(MyViewModel vm) 
{ 
    using (var db = new MyEntities()) 
    { 
     Post p = new Post(); 
     p.Text = vm.Text; 
     db.Posts.AddObject(p); 
     db.SaveChanges(); 
    } 
    return View(); 
} 

這工作得很好。用戶輸入到TextArea中的文本被傳遞到控制器,並通過實體框架保存到SQL Server中的Post表中。該字段的數據類型是varchar(1000)。 (在使用MetadataType和[StringLength(1000)]驗證的文本字段上也有模型驗證。)

我注意到如果我試圖複製一些HTML源文件並將其粘貼到TextArea中並提交它,我收到以下錯誤:

錯誤導致我this question「從客戶端檢測到有潛在危險的Request.Form值」,並從那裏是我可以簡單地添加拿走

[HttpPost, ValidateInput(false)] 

我的行動停止這種類型的驗證。這很有效,但是對我的臆測,無論我嘗試將其放入TextArea中,我都不會造成任何問題。如果我在javascript,html或T-SQL語句中粘貼引號字符,它仍然可以正常工作。我看到了我在SQL表中出現的TextArea中輸入的確切字符,並且如果將文本顯示回View,我會在源代碼中看到每個字符都轉換爲HTML對手,並且屏幕上的顯示看起來就像它是在我輸入時進行的。我沒有做任何類型的文本轉換來完成此操作。在默認情況下,一切正如我所願。當然,我對此感到高興,但是當我閱讀關於禁用驗證的信息時,通常會發出警告,告知您應該瞭解這樣做的後果,我認爲我不這樣做。所以我想知道,後果是什麼?有沒有什麼人可能會輸入到我的TextArea,可能會因爲禁用輸入驗證而導致混亂?

如果相關,我的特殊設置是MVC4,.NET 4.0,實體框架4.4,SQL Server 2012 Express。

回答

9

如果您使用的剃鬚刀,你的輸出將自動編碼的任何文本將出現在瀏覽器中的文本,但不被理解,如JavaScript等

如果關閉驗證過,你必須非常小心以確保您編碼的所有用戶輸入都顯示出來,這樣您就不會因爲用戶輸入的某些內容而在您的頁面上無意中運行某些JavaScript(請參閱XSS中的某些示例)。

通過向數據庫中的各種varchar字段添加某種javascript alert('hello')調用,並查看它在訪問該頁面時是否被調用,可以快速測試(雖然不是詳盡的搜索)。

此外,即使您不顯示用戶數據,它可能會影響取決於您如何進行數據訪問。

即使您使用類似於實體框架的東西,您也不會受到sql注入的保護,例如,如果您使用存儲過程並且未對輸入進行驗證檢查。請參閱Troy Hunt的article關於此

+0

謝謝。這正是我正在尋找的信息。 – TTT 2013-02-25 15:58:13

+0

加入了鏈接,發誓它原來! – 2013-02-25 23:58:33