防止对表单进行 XSS 攻击
Preventing XSS Attack on Form
全部:
我正在使用 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();
每当用户尝试 XSS,例如传递 javascript%3aalert('xss')%2f%2f 的 url 值时, JavaScript 运行并显示弹出窗口。
我试过 Antixss.HtmlEncode() 在将 URL 传递给 string.Format 之前对其进行编码,但仍然无效。我也试过 Antixss.UrlEncode() ,但这会出错,因为表单没有提交给 URL.
请帮帮我,是不是我遗漏了什么?我还能做什么?
提前致谢。
只是一个想法 - 尝试将此脚本放入而不只是 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%2Fscript%3E - 有效(未显示警报)
根据输入白名单验证用户输入始终是一种很好的做法,以防止 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 Vulnerabilities。这是为了通过将用户重定向到其他域来阻止网络钓鱼攻击。同样,使用白名单方法并确保重定向到的域是您自己的域。在此处进行解析时要小心,因为它很容易出错 - http://example.org?http://example.com
的 URL 将通过许多编写错误的验证例程的 example.com
的验证过滤器。我建议在 .NET 中使用 Uri
对象并通过它检索域,而不是滚动您自己的字符串函数。
您还可以检查 URL 是否是亲戚 URL,如果可以接受则允许。使用类似 this function 的东西,它使用内置的 .NET 库来确保它是相对的。
尝试使用 HttpUtility.UrlEncode
类似于Response.Write(HttpUtility.UrlEncode(urlString));
有关更多步骤,请参阅 How To: Prevent Cross-Site Scripting in ASP.NET =)
全部:
我正在使用 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();
每当用户尝试 XSS,例如传递 javascript%3aalert('xss')%2f%2f 的 url 值时, JavaScript 运行并显示弹出窗口。
我试过 Antixss.HtmlEncode() 在将 URL 传递给 string.Format 之前对其进行编码,但仍然无效。我也试过 Antixss.UrlEncode() ,但这会出错,因为表单没有提交给 URL.
请帮帮我,是不是我遗漏了什么?我还能做什么?
提前致谢。
只是一个想法 - 尝试将此脚本放入而不只是 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%2Fscript%3E - 有效(未显示警报)
根据输入白名单验证用户输入始终是一种很好的做法,以防止 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 Vulnerabilities。这是为了通过将用户重定向到其他域来阻止网络钓鱼攻击。同样,使用白名单方法并确保重定向到的域是您自己的域。在此处进行解析时要小心,因为它很容易出错 - http://example.org?http://example.com
的 URL 将通过许多编写错误的验证例程的 example.com
的验证过滤器。我建议在 .NET 中使用 Uri
对象并通过它检索域,而不是滚动您自己的字符串函数。
您还可以检查 URL 是否是亲戚 URL,如果可以接受则允许。使用类似 this function 的东西,它使用内置的 .NET 库来确保它是相对的。
尝试使用 HttpUtility.UrlEncode
类似于Response.Write(HttpUtility.UrlEncode(urlString));
有关更多步骤,请参阅 How To: Prevent Cross-Site Scripting in ASP.NET =)