Javascript 如何在ASP.NET MVC中编码值以放入iframe src属性以防止XSS
使用ASP.NET MVC,我有一个url,它采用一个名为path的查询字符串参数,该参数可以是我的站点中的url。我发现了一个XSS漏洞,无法正确编码路径值以防止XSS(但没有编写大量代码将可接受的URL列入白名单) 因此,用户访问的url是:Javascript 如何在ASP.NET MVC中编码值以放入iframe src属性以防止XSS,javascript,asp.net,asp.net-mvc,iframe,xss,Javascript,Asp.net,Asp.net Mvc,Iframe,Xss,使用ASP.NET MVC,我有一个url,它采用一个名为path的查询字符串参数,该参数可以是我的站点中的url。我发现了一个XSS漏洞,无法正确编码路径值以防止XSS(但没有编写大量代码将可接受的URL列入白名单) 因此,用户访问的url是: /iFrame?path=mypage.aspx XSS可以如下所示: /iFrame?path=javascript:alert%281%29 使用路径查询字符串值的iFrame的HTML为: <iframe src="@Model.Sou
/iFrame?path=mypage.aspx
XSS可以如下所示:
/iFrame?path=javascript:alert%281%29
使用路径查询字符串值的iFrame的HTML为:
<iframe src="@Model.Source"></iframe>
我也试过:
这两种方法仍然显示javascript警报框
是否有ASP.NET MVC的内置编码器对其进行编码,以便src不会执行javascript?或者我需要做一些白名单或其他方法来防止它吗?您需要解析URL并白名单协议 调用
Uri.TryParse()
,并拒绝任何返回false或具有HTTP或HTTPS以外协议的URL
您还需要决定是否允许相对URL。我建议阅读ASP.NET MVC 3 UrlHelper类中有关使用IsLocalUrl()方法的内容:
public bool IsLocalUrl(string url) {
return System.Web.WebPages.RequestExtensions.IsUrlLocalToHost(
RequestContext.HttpContext.Request, url);
}
System.Web.WebPages RequestExtensions类中的IsUrlLocalToHost()方法:
public static bool IsUrlLocalToHost(this HttpRequestBase request, string url)
{
return !url.IsEmpty() &&
((url[0] == '/' && (url.Length == 1 ||
(url[1] != '/' && url[1] != '\\'))) || // "/" or "/foo" but not "//" or "/\"
(url.Length > 1 &&
url[0] == '~' && url[1] == '/')); // "~/" or "~/foo"
}
我没有投反对票。我选择埃里克的答案是因为它易于使用。@slolife:Yes;他的答案更好。(假设不允许任何绝对URL)