Apache 2.4.51 绕过特定查询字符串的基本身份验证

Apache 2.4.51 绕过特定查询字符串的基本身份验证

我需要在我的网站上进行基本身份验证,除非 URL 中存在特定的哈希值。

AuthUserFile /path/to/.htpasswd
AuthType Basic
AuthName "Dev"

<RequireAny>
    <RequireAll>
        Require expr %{QUERY_STRING} = 'hash=123456'
    </RequireAll>

    Require valid-user
</RequireAny>

hash=123456基本身份验证有效,但即使在 URL 中也需要身份验证。我做错了什么?

更新

这是我的全部.htaccess内容。

AuthUserFile /path/to/.htpasswd
AuthType Basic
AuthName "Dev"
Require expr "%{QUERY_STRING} == 'hash=123456'"
Require valid-user

我打www.example.com/?hash=123456并且仍然需要我进行身份验证。

答案1

Require expr %{QUERY_STRING} = 'hash=123456'

您需要将整个表达式括在双引号中。并且==对于字符串比较,它应该是 (双等号),而不是=

您也不需要任何RequireAnyRequireAll容器,因为RequireAny这是隐含的默认值。

因此,以下内容应该足够了:

AuthUserFile /path/to/.htpasswd
AuthType Basic
AuthName "Dev"
Require expr "%{QUERY_STRING} == 'hash=123456'"
Require valid-user

请注意,以上是精确字符串比较。因此,如果可能存在其他查询字符串参数,则需要使用正则表达式。例如:

Require expr "%{QUERY_STRING} =~ /(^|&)hash=123456($|&)/"

或者,使用表达式,并且仅在以下情况<If>下应用 HTTP 身份验证:hash=123456不是出现在查询字符串中。例如:

<If "%{QUERY_STRING} !~ /(^|&)hash=123456($|&)/">
    AuthUserFile /path/to/.htpasswd
    AuthType Basic
    AuthName "Dev"
    Require valid-user
</If>

答案2

我猜测'in'hash=123456'是表达式的一部分,而不是您所期望的引号。

对于精确匹配,请尝试:

Require expr "%{QUERY_STRING} == hash=123456"

如果您有除 之外的其他参数hash,则可能需要正则表达式:

Require expr "%{QUERY_STRING} =~ /hash=123456/"

但是,这也将匹配someparam=foo&anythinghash=12345678。对此的可能修复:

Require expr "%{QUERY_STRING} =~ /(^|&)hash=123456($|&)/"

答案3

我最终在我的 PHP 控制器中检查了哈希值,并且只添加了.htaccess基于的异常Request_URI,但即使这样做,我仍然会收到身份验证提示。

然后我明白了我的异常是可以的,但特定的 URI 正在请求额外的资源,如 JS、CSS、字体和图像文件,这些资源不是在允许的 URI 上,这就是为什么我仍然需要进行身份验证。

我的目标是,2 个特定的 URI 无需身份验证即可完全访问(form/installationform/vehicules),因此,我所做的如下:

AuthUserFile /path/to/.htpasswd
AuthType Basic
AuthName "Dev"

SetEnvIf Request_URI ^/(form/installation|form/vehicules) noauth=1
<RequireAny>
  Require env noauth
  Require env REDIRECT_noauth
  Require valid-user
</RequireAny>
<FilesMatch "\.(?i:css|js|svg|otf|png|jpe?g|ico)$">
    Require all granted
</FilesMatch>

现在,两个 URI 都无需请求身份验证即可加载,并且包含所有需要的资源。

相关内容