【发布时间】:2011-10-01 13:30:57
【问题描述】:
相对于协议的 URL 不是我正在寻找的。我正在寻找一种绝对指定协议(http 与 https)的方法,同时保持 url 的主机名相对。
给定一个相对 URL,例如“/SearchForStuff”,我希望能够指定不同的协议“https 与 http”等,而不必指定主机/域名。
我们的网站有一个标题部分视图,我们显示在我们网站上每个页面的顶部。该网站上的某些页面是http,有些是https。标题包含用于站点范围搜索的文本框和按钮。站点搜索结果页面始终使用 http 提供,因此我们希望表单操作指向相对路径“/find”。但是,我们希望相同的标头在我们的许多内部测试服务器(10.10.10.123 等)以及面向公众的服务器(“www.publicfacingserver.com”)上工作,理想情况下不更改标头部分视图的内容。所以基本上我正在寻找的是一种为搜索操作指定协议同时保持服务器/主机名相对的方法。
目前,为确保用户无法从安全页面链接到站点搜索结果的安全页面,我们对用于站点搜索的操作的绝对 URL 进行硬编码,并使用协议和主机名,例如“http://www.publicsite.com/find”。问题是在测试服务器上点击该操作会将您重定向回我们的面向公众的网站。因此,为了进行测试,我们手动编辑主机文件以使测试服务器的 IP 地址等于我们面向公众的站点名称。这给我们自己作为开发人员带来了一些认知负担,并且还要求我们访问我们希望测试我们的站点的任何非编码人员的计算机,以在测试之前配置他们的主机文件,并在测试之后取消配置更改他们的主机文件。
下面的代码是我想出的最佳解决方案。有谁知道更好的方法?如果我的解决方案足够,它是否会产生任何安全漏洞?我不明白它是怎么做到的,因为如果恶意用户要伪造对我们面向公众的 IP 地址 X 的请求,但主机标头中的主机名与该 IP 地址不匹配,这只会导致 URL 不稳定被提供给同一用户。换句话说,我看不出有人可以通过在另一个站点的留言板上发布 URL 或类似的东西来使用它来创建 XSRF 漏洞利用:
public static string CurrentHostName(this UrlHelper helper, HttpProtocol protocol)
{
var result = string.Empty;
if (protocol == HttpProtocol.Secure) result += "https://";
if (protocol == HttpProtocol.UnSecure) result += "http://";
if (protocol == HttpProtocol.Current) result += HttpContext.Current.Request.Url.Scheme;
result += HttpContext.Current.Request.Url.Host;
if (HttpContext.Current.Request.Url.Port != 80) result += ":" + HttpContext.Current.Request.Url.Port.ToString();
return result;
}
HttpProtocol 是我自己创建的一个枚举。
谢谢!
【问题讨论】:
-
你不能只创建一个名为
HOST(或其他东西)的 app_config 变量并在 LIVE/DEV 上更改它吗?
标签: c# asp.net https http-headers