防止XSS攻击形式

时间:2015-11-04 20:35:24

标签: javascript c# asp.net-mvc-4 xss antixsslibrary

所有

我正在使用C#MVC4

的项目存在问题

在项目中,我接受来自用户的 URL 和其他参数,然后进行一些处理并将处理结果发送到由 URL提供的 URL 用户。

使用以下代码发送结果:

var context = HttpContext.Current;

context.Response.Write("<html><head>");
context.Response.Write("</head><body>");

context.Response.Write(string.Format("<form name=\"myform\" method=\"post\" action=\"{0}\" >", postUrl));

context.Response.Write("</form>");
context.Response.Write("<script type=\"text/javascript\">document.myform.submit();</script></body></html>");

context.Response.Write("</body>");
context.Response.Flush();
context.Response.Clear();
context.ApplicationInstance.CompleteRequest();

每当用户尝试使用XSS,例如传递 javascript%3aalert(&#39; xss&#39;)%2f%2f 的网址值时,JavaScript就会运行并显示弹出窗口。

我已经尝试过Antixss.HtmlEncode()来对URL进行编码,然后再将其传递给string.Format,但仍然无法正常工作。我也尝试过Antixss.UrlEncode(),但由于表单没有提交给网址,因此会出错。

请帮助我,有什么我想念的吗?我还能做什么?

提前致谢。

4 个答案:

答案 0 :(得分:1)

您需要采用三管齐下的方法来解决此问题。

防止XSS注射:

请注意,如果用户注入了网址值

" /> <script>alert('xss')</script>

这也会让你感到脆弱:

<form name="myform" method="post" action="" /> <script>alert('xss')</script>" >

因此,您应该使用HttpUtility.HtmlAttributeEncode函数来解决这个问题。

但是,不要就此止步。如上所述,您应该针对javascript:样式网址进行投射。为此,我会确保网址以http://https://开头。如果没有,抛出一个SecurityException,你应该记录并处理服务器端,并向用户显示一个自定义错误页面。

最后,您要防范Open Redirect Vulnerabilities。这是通过将用户重定向到其他域来阻止网络钓鱼攻击。同样,使用白名单方法并确保重定向到的域是您自己的域之一。这里解析时要小心,因为很容易弄错 - http://example.org?http://example.com的URL会在许多编写错误的验证例程上传递example.com的验证过滤器。我建议在.NET中使用Uri对象并通过它来检索域,而不是滚动自己的字符串函数。

您还可以检查网址是否为相对网址,并在可接受的情况下允许该网址。使用this function之类的东西,它使用内置的.NET库来确保它是相对的。

答案 1 :(得分:0)

只是一个想法 - 尝试将此脚本放入而不仅仅是document.myform.submit(并删除表单的action属性):

if("{0}".indexOf('http') !== 0) {
    //this is some sort of injection, or it's pointing at something on your server. Should cover http and https.
    //Specifically, it makes sure that the url starts with 'http' - so a 'javascript' url isn't going to work.
} else {
    document.myform.action="{0}"
    document.myform.submit();
}

你可以做的更多,但这应该有所帮助。

答案 2 :(得分:0)

由于您要将postUrl添加为属性&#34; action&#34;在表单标签中,您可以尝试在HttpUtility中使用HtmlAttributeEncode方法

[ValidateInput(false)]
public ActionResult Test(string url)
{
    var context = System.Web.HttpContext.Current;

    context.Response.Write("<html><head>");
    context.Response.Write("</head><body>");

    context.Response.Write(string.Format("<form name=\"myform\" method=\"post\" action=\"{0}\" >", HttpUtility.HtmlAttributeEncode(url)));

    context.Response.Write("</form>");
    context.Response.Write("<script type=\"text/javascript\">document.myform.submit();</script></body></html>");

    context.Response.Write("</body>");
    context.Response.Flush();
    context.Response.Clear();
    context.ApplicationInstance.CompleteRequest();
    return null;
}

http://localhost:39200/home/test?url=https%3A%2F%2Fwww.google.com - 工作了 http://localhost:39200/home/test?url=%3Cscript%3Ealert(%27test%27)%3C%2Fscript%3E - 工作(没有显示警报)

最好根据白色输入列表验证用户输入,以防止XSS攻击。

答案 3 :(得分:0)

尝试使用HttpUtility.UrlEncode

类似于Response.Write(HttpUtility.UrlEncode(urlString));

请参阅How To: Prevent Cross-Site Scripting in ASP.NET了解更多步骤=)