【问题标题】:Ensure page is only accessed via SSL确保页面只能通过 SSL 访问
【发布时间】:2009-03-26 14:38:53
【问题描述】:

如何确保我的用户不能物理输入 http: 来绕过我的 SSL 并确保每个页面都是 https:?

可能是我的母版页上的重定向?

【问题讨论】:

    标签: c# asp.net ssl


    【解决方案1】:

    这通常通过 IIS 配置或使用 ISAPI 过滤器来处理,但如果您想在应用程序代码中执行此操作,您可以在母版页的 Page_Init 事件中放置类似的内容...

    If Not Request.IsSecure
        Response.Redirect(Request.Url.AbsoluteUri.Replace("http://", "https://"))
    End If
    

    【讨论】:

    • 不是最好的想法。您正在将客户端重定向回调用页面。如果由于某种原因(没有证书或错误证书)没有 SSL,您将进入递归循环。更好的选择是重定向到错误页面,因为用户不应该输入仅安全的站点/页面,除非代码错误地这样做或他们弄乱了 URL。
    • 这适用于 string.replace 方法将所有出现的“http://”更改为“https://”,而不仅仅是初始方案。 IE。它可能会干扰查询字符串参数。
    • @Daniel 如果您的查询字符串中有 : 或 / 字符,那么您将需要担心其他问题;)
    • @Nissan 我认为可以安全地假设您需要有效的证书才能使此方法起作用。
    • @Josh 我认为你没有理解我的意思......在非标准场景中将用户重定向回 URL 不应该这样做,因为它可能会无休止地递归并因此造成混淆。
    【解决方案2】:

    我会使用单独的页面将所有 http url 重定向到 https,或者使用 IIS 配置中的“需要安全通道”选项,如果有人尝试访问非 https 页面,则会显示错误。

    Here's 一个站点,其中包含将错误页面重定向到您站点的 https URL 的指南。

    【讨论】:

    • 在 Web 服务器级别执行此操作是迄今为止最好的选择。如果您特别引入 SSL 负载平衡硬件,它将提供更大的灵活性。
    【解决方案3】:

    以下内容基于 Josh Stodolas 的回答 (IsSecureConnection),但使用 UriBuilder 将方案更改为 https 而不是字符串替换。这种方法的好处是它不会将 URL 中所有出现的“http”更改为“https”。

    if (!Request.IsSecureConnection)
    {
        UriBuilder newUri = new UriBuilder(Request.Url);
        newUri.Scheme = Uri.UriSchemeHttps;
        Response.Redirect(newUri.Uri.AbsoluteUri);
    }
    

    【讨论】:

      【解决方案4】:

      我使用 HTTPModule 完成了这项工作,这样您就不必担心将代码放在每个母版页中(如果您有多个母版页)。此版本还关闭了 localhost 的重定向,因此您不必在自己的机器上安装 SSL。基本上你可以像这样创建一个新的 HTTP 模块:

      Public Class RedirectToHttpsModule
          Implements IHttpModule
      
          Public Sub Dispose() Implements IHttpModule.Dispose
      
          End Sub
      
          Public Sub Init(ByVal context As HttpApplication) Implements IHttpModule.Init
              AddHandler context.BeginRequest, AddressOf context_BeginRequest
          End Sub
      
          Private Sub context_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
              Dim application As HttpApplication = TryCast(sender, HttpApplication)
              If Not application.Request.IsSecureConnection And Not application.Request.IsLocal Then
                   application.Response.Redirect(application.Request.Url.ToString().Replace(application.Request.Url.Scheme, "https"))
              End If
          End Sub
      
      End Class
      

      您还必须在 web.config 中为 HTTPModule 添加适当的行:

      <httpModules>
            <add type="RedirectToHttpsModule" name="RedirectToHttpsModule" />
      </httpModules>
      

      【讨论】:

        【解决方案5】:
        if(!String.Equals(Request.Url.Scheme,
                          "https",
                          StringComparison.OrdinalIgnoreCase)) { }
        

        【讨论】:

        • 这是一个只读属性 - 请参阅 msdn.microsoft.com/en-us/library/system.uri.scheme.aspx
        • 是的。字符串比较没问题吧?
        • 是的,看起来您的答案已被编辑以反映这一点。我之所以发表评论,是因为第一篇文章表明您可以通过编程方式将方案从 http" 更改为 "https"。
        【解决方案6】:

        如果您只想接受安全连接,请为端口 80 创建一个单独的服务, 重定向到 HTTPS。理想情况下,您会在 HTTP 重定向中保留请求的路径。

        如果您只是想鼓励 HTTPS 连接进行浏览(例如,不关心机器人),请将其添加到您的页面:

        <script type="text/javascript">
        if(location.protocol=='http:')
          location=location.toString().replace(/^http:/,'https:');
        </script>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-13
          • 1970-01-01
          • 2023-04-02
          • 2021-09-12
          • 1970-01-01
          • 2013-11-15
          • 1970-01-01
          相关资源
          最近更新 更多