4

我正在尝试保护我的网站免受跨站点脚本 (XSS) 的影响,并且我正在考虑使用正则表达式来验证用户输入。

这是我的问题:我有一个危险的 HTML 标签列表......

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

...我想将它们包含在正则表达式中 - 这可能吗?如果没有,我应该使用什么?你有什么想法如何实现这样的东西吗?

4

4 回答 4

7
    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);
    }
于 2015-05-06T14:35:58.253 回答
6

请阅读OWASP XSS(跨站点脚本)预防备忘单以获取广泛的信息。黑名单标签不是一种非常有效的方法,并且会留下空白。您应该过滤输入、在输出到浏览器之前进行清理、编码 HTML 实体以及我的链接中讨论的各种其他技术。

于 2013-03-22T19:27:56.590 回答
5

您应该将字符串编码为 HTML。使用 dotNET 方法

HttpUtils.HtmlEncode(string text)

有更多细节http://msdn.microsoft.com/en-us/library/73z22y6h.aspx

于 2013-03-22T19:32:17.720 回答
2

正如已经讨论过的,将黑名单作为清理措施是无效的。想想当有人提交精心制作的输入时,您的黑名单会发生什么:

<SCRIPT>
<ScRiPt>
< S C R I P T >
<scr&#00ipt>
<scr<script>ipt>(您是否递归应用了黑名单;-))

这不是对可能的攻击的列举,而只是一些关于如何打败黑名单的例子。这些都将在浏览器中正确呈现。

于 2013-03-22T19:55:33.697 回答