全部:
我在使用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 %3警报的url值(‘xss’)%2f%2f%2f,JavaScript就会运行并弹出。
我尝试过Antixss.HtmlEncode()在将URL传递到string.Format之前对其进行编码,但仍然无法工作。我也尝试过Antixss.UrlEncode(),但这会产生错误,因为表单不提交给URL。
请帮帮我,我是不是少了点什么?我还能做什么?
提前谢谢。
发布于 2015-11-05 16:14:25
你需要三管齐下的方法来解决这个问题。
预防XSS注射:
注意,如果用户注入url值
" /> <script>alert('xss')</script>这也会使你易受伤害:
<form name="myform" method="post" action="" /> <script>alert('xss')</script>" >因此,您应该使用HttpUtility.HtmlAttributeEncode函数来解决这个问题。
不过,别到此为止。如前所述,您应该针对javascript:样式URL进行项目设计。为此,我将确保URL以http://或https://开头。如果不是,抛出一个SecurityException,您应该记录和处理服务器端,并向用户显示一个自定义错误页面。
最后,您想要防止开放重定向漏洞。这是通过将用户重定向到其他域来阻止网络钓鱼攻击。同样,使用白名单方法并确保重定向到的域是您自己的域。这里的解析要小心,因为它很容易出错-- http://example.org?http://example.com的URL将在许多写得不好的验证例程上通过example.com的验证筛选器。我建议在Uri中使用.NET对象并通过它检索域,而不是滚动自己的字符串函数。
您还可以检查URL是否是相对URL,如果可以允许允许的话。使用类似于这一功能的东西,它使用内置的.NET库来确保它是相对的或非相对的。
发布于 2015-11-04 20:53:32
只是一个想法-尝试将这个脚本放入而不仅仅是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();
}你可以做的更多,但这应该会有所帮助。
发布于 2015-11-04 21:06:07
由于要将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攻击。
https://stackoverflow.com/questions/33531490
复制相似问题