首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止XSS攻击表单

防止XSS攻击表单
EN

Stack Overflow用户
提问于 2015-11-04 20:35:23
回答 4查看 3.6K关注 0票数 2

全部:

我在使用C# MVC4进行的一个项目中遇到了问题

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

正在使用以下代码发送结果:

代码语言:javascript
复制
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。

请帮帮我,我是不是少了点什么?我还能做什么?

提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-11-05 16:14:25

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

预防XSS注射:

注意,如果用户注入url值

代码语言:javascript
复制
" /> <script>alert('xss')</script>

这也会使你易受伤害:

代码语言:javascript
复制
<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库来确保它是相对的或非相对的。

票数 1
EN

Stack Overflow用户

发布于 2015-11-04 20:53:32

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

代码语言:javascript
复制
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();
}

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

票数 0
EN

Stack Overflow用户

发布于 2015-11-04 21:06:07

由于要将postUrl添加为表单标记的属性"action“,所以可以在HttpUtility中使用HtmlAttributeEncode方法。

代码语言:javascript
复制
[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攻击。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33531490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档