【发布时间】:2013-05-25 07:09:33
【问题描述】:
首先,我一直在就这个主题进行大量阅读/研究,但我仍然对什么是最佳实践感到有些困惑。
我已经检查并阅读了以下关于该主题的所有非常有用且内容丰富的页面:
https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet
http://msdn.microsoft.com/en-us/library/ms437314.aspx
how to encode href attribute in HTML
HttpServerUtility.UrlPathEncode vs 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。
更新:
我尝试使用稍后将在 href 属性中使用的用户输入来测试将 javascript 插入 url 的各个部分,我注意到了一些奇怪的地方。
我目前正在使用这种编码设置进行测试:
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 的查询字符串部分中的空格。我想这是一件好事,但与我对文档的理解不一致。
我想我仍然不知所措,但我所尝试的每个本地和外部链接都没有被破坏或危险,因此我将继续使用它,直到我对此的理解得到澄清为止。
【问题讨论】:
标签: c# url href webmatrix encode