防止表单上的XSS攻击

本文关键字:XSS 攻击 表单 | 更新日期: 2023-09-27 18:20:31

全部:

我使用C#MVC4 进行的一个项目有问题

在该项目中,我接受用户的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();

每当用户尝试像传递javascript%3alarm('XSS')%2f%2f这样的XSS url值时,javascript就会运行并显示弹出窗口。

在将URL传递到字符串之前,我已经尝试过Antixs.HtmlEncode()对其进行编码。格式化,但仍然不起作用。我也尝试过Antixss.UrlEncode(),但由于表单没有提交到URL,所以会出现错误。

请帮帮我,我缺什么了吗?我还能做什么?

提前谢谢。

防止表单上的XSS攻击

您需要三管齐下的方法来解决这个问题。

防止XSS注入:

注意,如果用户注入了url值

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

这也会让你变得脆弱:

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

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

然而,不要止步于此。如前所述,您应该针对javascript:样式的URL进行投影。为此,我将确保URL以http://https://开头。如果没有,抛出一个SecurityException,您应该在服务器端记录和处理它,并向用户显示一个自定义错误页面。

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

您还可以检查URL是否是相对URL,如果可以接受,则允许它。使用类似这样的函数,该函数使用内置的.NET库来确保它是相对的还是非相对的。

只是一个想法-试着把这个脚本放进去,而不仅仅是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();
}

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

由于您将postUrl添加为表单标记的属性"action",因此可以尝试在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%2Script%3E-已工作(未显示警报)

根据输入白名单验证用户输入始终是一种很好的做法,以防止XSS漏洞利用。

尝试使用HttpUtility.UrlEncode

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

有关更多步骤,请参阅"如何:防止ASP.NET中的跨站点脚本编写"=)