2013-03-22 213 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