首先,我一直在对这个主题进行大量阅读/研究,但对于最佳实践是什么,我仍然有些困惑。
我已经检查并阅读了以下关于该主题的所有非常有用和信息丰富的页面:
https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet
http://msdn.microsoft.com/en-us/library/ms437314.aspx
HttpServerUtility.UrlPathEncode 与 HttpServerUtility.UrlEncode
这是我的设置(内容变量稍后将用 呈现Html.Raw()
):
content += "<a class=\"contentLink\" href=\"" + subRow.linkHref + "\" target=\"_blank\">" + subRow.linkText + "</a>";
的编码subRow.linkText
很简单(只需一个简单的 HtmlEncode 方法就可以确保这一点),但是我和其他人一样对如何根据资源(如上面的链接所示)和当今的最佳实践对 href 属性进行编码感到困惑。
更新:插入“href”属性的所有内容都是用户输入的。我希望这样,以便他们可以选择他们在 Google Drive 或任何其他相关网站上发布的内容的路径,或者甚至是内部 .pdf 文件或图片的关系路径(以编程方式构建),如果他们选择的话。
我确实知道我可以使用的方法之间的差异,但我不确定我应该应用哪些或多少以及以什么顺序?我什至应该使用HttpUtility.HtmlAttributeEncode
吗?
这个问题的背景是从希望我的网站不中断的角度来看,当然,还要防止 XSS。
更新:
我尝试使用稍后将在属性中使用的用户输入来测试将 javascript 插入 url 的各个部分,href
我注意到了一些奇怪的地方。
我目前正在使用这种编码设置进行测试:
content += "<a class=\"contentLink\" href=\"" + HttpUtility.HtmlEncode(HttpUtility.UrlPathEncode(subRow.linkHref)) + "\" target=\"_blank\">" + HttpUtility.HtmlEncode(subRow.linkText) + "</a>";
实际上,首先我是 url 编码(使用 UrlPathEncode),然后是 HTML 编码。我相信这可能是正确的方法,因为 HTML 编码的文本会到达 DOM,并且仍应呈现为 URL(我认为)。
然而,正如我所说,我注意到了一些奇怪的地方。
- 我将此用作用户输入:
http://localhost:10226/home.cshtml?javascript:var a = "hi"; alert(a); void(0);
并且没有执行任何 javascript,但我不相信这一定是因为我的编码(也就是说,我可以看到高级浏览器不再允许从 url 运行 javascript,因为它是一个巨大的一般来说,据我了解,安全漏洞和不良做法,但当然,我不能指望这一点)。 - 单击使用此测试用户输入显示的链接后,地址栏显示:
http://localhost:10226/home.cshtml?javascript:var%20a%20=%20%22hi%22;%20alert(a);%20void(0);
这是我有点困惑的地方。从上面链接中显示的研究来看,UrlPathEncode
应该忽略 之后的编码?
,但是您可以清楚地看到它%
对该 url 的查询字符串部分中的空格进行了编码。我想这是一件好事,但与我对文档的理解不一致。
我想我仍然不知所措,但是我尝试过的每个本地和外部链接都没有损坏,也没有我可以说的危险,所以我将继续使用它,直到我对此的理解得到澄清为止。