我应该如何在我的WebMatrix C#站点中编码我的href属性?

时间:2013-05-29 21:07:18

标签: c# url href webmatrix encode

首先,我一直在做很多关于这个主题的阅读/研究,但我仍然对这方面的最佳做法感到困惑。

我已检查并阅读以下所有关于此主题的非常有用且信息丰富的页面:

  

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云端硬盘或任何其他相关网站上发布的内容,甚至是关系路径(以编程方式构建)到内部.pdf文件或图片。 < / p>

我确实得到了我可用的方法之间的差异,但我不确定应该应用哪个或多少以及以什么顺序应用?我应该使用HttpUtility.HtmlAttributeEncode吗?

这个问题的背景是希望我的网站不要破坏,当然还要防止XSS。

更新

我尝试使用稍后将在href属性中使用的用户输入来测试将javascript插入到网址的各个部分,我注意到了一些奇怪的事情。

我目前正在使用此编码设置进行测试:

content += "<a class=\"contentLink\" href=\"" + HttpUtility.HtmlEncode(HttpUtility.UrlPathEncode(subRow.linkHref)) + "\" target=\"_blank\">" + HttpUtility.HtmlEncode(subRow.linkText) + "</a>";

实际上,首先我是url编码(使用UrlPathEncode),然后我是HTML编码。我相信这可能是正确的方法,因为HTML编码的文本将会访问DOM,并且仍然可以作为URL正常呈现(我认为)。

然而,正如我所说,我注意到了一些奇怪的事情。

  1. 我使用此作为用户输入:http://localhost:10226/home.cshtml?javascript:var a = "hi"; alert(a); void(0);并且没有javascript执行,但我不相信这是因为我的编码(也就是说,我可以看到高级浏览器不再允许从网址,因为它是一个巨大的安全漏洞和糟糕的做法,总的来说,从我的理解,但是,当然,我不能依靠这个。)
  2. 点击使用此测试用户输入显示的链接后,地址栏显示为:http://localhost:10226/home.cshtml?javascript:var%20a%20=%20%22hi%22;%20alert(a);%20void(0);这是我有点困惑的地方。根据上面链接中显示的研究,UrlPathEncode应该忽略?之后的编码,但是您可以清楚地看到它%编码了此网址的查询字符串部分中的空格。我想这是一件好事,但与我对文档的理解不一致。
  3. 我想我仍然感到茫然,但我所尝试过的每一个本地和外部链接都没有被破坏,也没有危险,所以我将继续使用它,直到我对此的理解得到澄清。

1 个答案:

答案 0 :(得分:0)

我不知道这是否适用于您要做的事情,因为阅读您的帖子给了我一些“分析Paralisys”但我可以提供不同的观点。我已经开始依赖于调用java脚本函数的做法,并且应该为构建url字符串提供更多选项。这是HTML:

         <a class="link_looks_like_button" onclick=openWin("../SendMail/ContractorInfo",700,850);>Add/Update Contractor</a>

然后我的Javascript:

   <script type="text/javascript">
    function openWin(url, width, height)
    {
        myWindow=window.open(url,'_blank','width='+width+',height='+height);
        myWindow.focus();
    }

当然,现在你已经把它放在java脚本中了,你可以用firebug检查你的“url”字符串并使用java脚本操作它。

我希望这会有所帮助。

以下是JSFiddle的链接:http://jsfiddle.net/fonsecat/gzzzU/25/