绕过推荐人的基本身份验证

Bypass basic authentication for referrer

我编写了一段非常糟糕的 htaccess 代码作为让我们继续前进的权宜之计,但糟糕的代码让每个人都不高兴。所以这里是:

DomainA.com 托管一些我们需要拉入 DomainB.com 和 DomainB.com.

的所有子域的代码

这是我们想出的可怕的代码,并在 DomainA.com 的 htaccess 文件上运行:

<If "%{HTTP_REFERER} == 'https://DomainB.com/testpage1.php'">
</If>

<ElseIf "%{HTTP_REFERER} == 'https://DomainB.com/testpage2.php'">
</ElseIf>

<ElseIf "%{HTTP_REFERER} == 'https://DomainB.com/testpage3.php'">
</ElseIf>

<Else>
AuthType Basic
AuthName "Our Walled Garden - Login Credentials Required"
AuthUserFile /path/to/.htpasswd
Require valid-user
</Else>

你能帮我们 trim 把它写下来,这样我们就不必为请求定义协议或特定的子域了吗?我弄乱了一些正则表达式,我什至无法在 IF 块中进行简单的正则表达式匹配。

如果您想使用正则表达式,可以使用 SetEnvIf 和附加的 Require 子句。

可能是这样的:

SetEnvIfNoCase Referer ^https://DomainB\.com/(testpage1|testpage2|testpage3)\.php$ noauth=1

AuthType Basic
AuthName "Our Walled Garden - Login Credentials Required"
AuthUserFile /path/to/.htpasswd
Require valid-user
Require env noauth

当有多个Require指令时,它们会自动分组为"Require Any"(参见Require apache 2.4 docs)。

Setenv 指令与 referer 匹配,如果匹配 "noauth" env 变量就会被设置。然后 require 指令说 valid-user 或 noauth env 变量将满足访问。

请注意,referer 很容易被伪造,因此这并不是很安全。