2013-03-22 176 views
2

我試圖保護我的網站免受跨站點腳本(XSS)的攻擊,並且我正在考慮使用正則表達式來驗證用戶輸入。防止XSS或其他東西的正則表達式?

這裏是我的問題:我有危險的HTML標籤的列表...

<applet> 
<body> 
<embed> 
<frame> 
<script> 
<frameset> 
<html> 
<iframe> 
<img> 
<style> 
<layer> 
<link> 
<ilayer> 
<meta> 
<object> 

...我想將它們包括在正則表達式 - 這可能嗎?如果不是,我應該使用什麼?你有什麼想法如何實現這樣的東西?

+1

爲什麼這些輸入是危險的?一個字符串不是危險的,這是你用它做的事情,這可能是危險的。那麼你對輸入做什麼? – 2013-03-22 19:26:13

+5

Obligatory:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – 2013-03-22 19:27:20

+0

'' – Andrey 2013-03-22 19:28:13

回答

5

請閱讀OWASP XSS (Cross Site Scripting) Prevention Cheat Sheet瞭解各種信息。黑名單標籤並不是一種非常有效的方式,而且會留下空白。你應該過濾輸入,在輸出到瀏覽器之前進行清理,對HTML實體進行編碼,以及在我的鏈接中討論的各種其他技術。

+0

我使用Ajax過濾,它不允許'<>〜'!@#$%^ &*()''但我想確保我沒有錯過任何東西 – Andrey 2013-03-22 19:32:23

+0

您應該過濾/清理/驗證數據客戶端和服務器端,特別是如果您要處理傳送到數據庫的信息。存儲的XSS(持久性)可能是一件非常非常糟糕的事情。即使您阻止表單字段被「壞字符」填寫,我仍然可以直接發佈到您的表單進行處理。處理兩端的事情! – 2013-03-22 19:35:58

+0

這意味着我必須在插入服務器端之前進行驗證。感謝名單! – Andrey 2013-03-22 19:37:59

5

您應該將字符串編碼爲HTML。使用DOTNET方法

HttpUtils.HtmlEncode(string text) 

還有更多的細節http://msdn.microsoft.com/en-us/library/73z22y6h.aspx

+0

+1這是所有需要的,它不一定比這更復雜。但是,這個問題當然和不使用參數化查詢時一樣 - 有些開發人員真的善於忘記逃跑。所以使用像razor這樣的模板語言和autoescape要好得多。 – Esailija 2013-03-22 19:49:06

+0

我在我的項目中只使用了過程,但仍想保護跨站腳本 – Andrey 2013-03-22 20:04:02

+0

您將受到保護!編碼後您的標籤將被視爲一如既往的數據 – Jacek 2013-03-22 20:40:08

1

黑名單的消毒是無效的,因爲已經討論過了。想想會發生什麼黑名單,當有人提出打造輸入:

<SCRIPT>
<ScRiPt>
< S C R I P T >
<scr&#00ipt>
<scr<script>ipt>(你申請的黑名單遞歸;-))

這不是一個枚舉可能發生的攻擊,但只是一些例子要記住黑名單如何被擊敗。這些將全部在瀏覽器中正確呈現。

+0

我之前問如何做這個白色和黑色的名單,但沒有得到任何答案,你可以分享一些鏈接,可以介紹如何做到這一點? – Andrey 2013-03-22 20:02:47

+0

我不知道任何在線教程,但[Web應用黑客手冊](http://www.amazon.com/Web-Application-Hackers-Handbook-Exploiting/dp/1118026470)是一個很好的網絡資源應用安全。它會教你所有關於這個問題,這是一個有趣的閱讀。 – 2013-03-22 20:08:06

+0

我有這本書:) – Andrey 2013-03-22 20:13:52

2
public static bool ValidateAntiXSS(string inputParameter) 
    { 
     if (string.IsNullOrEmpty(inputParameter)) 
      return true; 

     // Following regex convers all the js events and html tags mentioned in followng links. 
     //https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet     
     //https://msdn.microsoft.com/en-us/library/ff649310.aspx 

     var pattren = new StringBuilder(); 

     //Checks any js events i.e. onKeyUp(), onBlur(), alerts and custom js functions etc.    
     pattren.Append(@"((alert|on\w+|function\s+\w+)\s*\(\s*(['+\d\w](,?\s*['+\d\w]*)*)*\s*\))"); 

     //Checks any html tags i.e. <script, <embed, <object etc. 
     pattren.Append(@"|(<(script|iframe|embed|frame|frameset|object|img|applet|body|html|style|layer|link|ilayer|meta|bgsound))"); 

     return !Regex.IsMatch(System.Web.HttpUtility.UrlDecode(inputParameter), pattren.ToString(), RegexOptions.IgnoreCase | RegexOptions.Compiled); 
    } 
+0

Upvote至少試圖做OP的要求!不知道它是否工作...;) – 2016-11-03 11:16:32