【问题标题】:How should I encode my href attribute in my WebMatrix C# site?我应该如何在我的 WebMatrix C# 站点中编码我的 href 属性?
【发布时间】: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(我认为)。

但是,正如我所说,我注意到了一些奇怪的地方。

  1. 我使用它作为用户输入:http://localhost:10226/home.cshtml?javascript:var a = "hi"; alert(a); void(0); 并且没有执行任何 javascript,但我不相信这一定是因为我的编码(也就是说,我可以看到高级浏览器不再允许从 url 运行 javascript ,因为这是一个巨大的安全漏洞和不好的做法,一般来说,根据我的理解,但是,当然,我不能指望这一点)。
  2. 单击使用此测试用户输入显示的链接后,地址栏显示为:http://localhost:10226/home.cshtml?javascript:var%20a%20=%20%22hi%22;%20alert(a);%20void(0); 这就是我有点困惑的地方。从上面链接中显示的研究中,UrlPathEncode 应该忽略? 之后的编码,但是您可以清楚地看到% 编码了此 url 的查询字符串部分中的空格。我想这是一件好事,但与我对文档的理解不一致。

我想我仍然不知所措,但我所尝试的每个本地和外部链接都没有被破坏或危险,因此我将继续使用它,直到我对此的理解得到澄清为止。

【问题讨论】:

    标签: c# url href webmatrix encode


    【解决方案1】:

    我不知道这是否适用于您正在尝试做的事情,因为阅读您的帖子给了我一些“Analysis 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/

    【讨论】:

    • 我会尝试把它放到一个 jsfiddle 例子中
    • 感谢您的输入,如果我还没有使用其他开发工具来告诉我的网址“实际上”在真实文本中的样子,这将非常有帮助。但是,我喜欢将所有 javascript(或任何类型的脚本)排除在 DOM 之外。我从不使用“onclick”、“onmouseover”等。我在外部 javascript 文件中设置了事件处理程序。不是 100% 确定这是否总是好的做法,但我在某处听说最好不要将 javascript 插入 DOM。无论如何,如果您愿意的话,我(可能其他人也会)仍然喜欢看到您的代码的 jsfiddle :)
    • 你明白了!我已经用指向 JSFiddle 的链接更新了答案
    • 我想我明白你在做什么,但我认为它不起作用。当我单击“示例”按钮时,没有任何反应。我会给出建议,但我很少(如果有的话)使用过Window.Open
    猜你喜欢
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2010-09-05
    • 2013-03-19
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 2012-05-03
    相关资源
    最近更新 更多