允许来自 HTTP-basic 保护的 SSL Apache 站点的 referer

允许来自 HTTP-basic 保护的 SSL Apache 站点的 referer

我有一个受基本身份验证保护的 Apache 站点HTTP。身份验证工作正常。现在我想通过依赖标头来绕过来自特定网站的用户的身份验证HTTP Referer

配置如下:

    SetEnvIf Referer "^http://.*.example\.org" coming_from_example_org
    <Directory /var/www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride None
            Deny from all
            Allow from env=coming_from_example_org
            AuthName "login required"
            AuthUserFile /opt/http_basic_usernames_and_passwords
            AuthType Basic
            Require valid-user
            Satisfy Any
    </Directory>

对于 来说,这工作正常HTTP,但对于 来说却失败了HTTPS。我的理解是,为了检查HTTP标题,SSL必须完成握手,但apache希望<Directory>在进行握手之前检查指令SSL,即使我将它们放在配置文件的底部。

问:我该如何解决这个问题?

附言:我并不痴迷于标题HTTP referer,我可以使用其他选项,允许已知网站的用户绕过身份验证。

答案1

您可能需要大大改进您的身份验证机制;鉴于 referer 标头由客户端控制,我预计大约需要 18 秒才能弄清楚您正在做什么并绕过它。

我使用的机制可能涉及为您的网站设置一个 cookie,以表明用户已“预先认证”。然后,您可以在 apache 配置中测试该 cookie 内容是否存在(以及加密是否有效),并允许通过这种方式进行访问。

答案2

我建议你使用授权脚本

IE。mod_python http://modpython.org/live/current/doc-html/dir-handlers-auh.html

你也许可以使用这样的东西:

def authenhandler(req):
    if req.headers_in.get("referer") == 'yourhostname':
        return apache.OK
    pw = req.get_basic_auth_pw()
    user = req.user     
    if user == "spam" and pw == "eggs":
        return apache.OK
    else:
        return apache.HTTP_UNAUTHORIZED

mod_perl可以处理可编写脚本的身份验证,也可能处理其他语言

相关内容