【问题标题】:Block everyone, except visitors from specific referrer with htaccess使用 htaccess 阻止所有人,除了来自特定推荐人的访问者
【发布时间】:2021-05-30 08:14:31
【问题描述】:

在 htaccess 中,我如何阻止除来自特定域的访问者之外的所有访问者

我试过了,但没有成功:

# serve everyone from specific-domain or specific-user-agent 
RewriteCond %{HTTP_REFERER} ^https?://www.specific-domain.com 
RewriteRule ^ - [L]
    
    # everybody else receives a forbidden 
    RewriteRule ^ - [F]
    
    ErrorDocument 403 /forbidden.html

更新:我在下面的代码中取得了一定的成功,但它肯定会破坏我的网页,因为以下参数会覆盖或干扰外观。如果有人知道如何订购它的好方法?

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https://authorizedreferer.com
RewriteRule ^ - [L]
RewriteRule ^ https://unprotected.mydomain.com/ [R,L]
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

【问题讨论】:

  • 来自您自己域的请求呢?直接请求呢?
  • 暂时忘记.htaccess...在尝试在.htaccess 中实现某些内容之前,您需要掌握HTTP 请求的情况。您的网站是否只是一个没有静态资产(CSS、JS、图像等)的页面?如果不是,那么当用户请求您网站的页面时,您的网站本身将在请求静态资产时生成Referer 标头。另外,直接请求和其他未设置Referer 的请求呢?你可以屏蔽这些吗?
  • 旁白:您添加的第二个代码块没有多大意义?你用的是前置控制器吗?
  • “我试过这个但没有成功” - 你的具体意思是什么?究竟会发生什么?第一个代码块应该做你所要求的,即。阻止所有请求,除非Referer HTTP 请求标头不以指定的 URL 开头。但是,这可能不是您应该做的全部(正如我在上面的第一条评论中所询问的那样)。
  • 事实是,如果我在第一个块中评论 #RewriteRule ^ - [F] 我的主页以 css 样式返回,但是引用限制已经消失(你现在必须明白,我不知道知道为什么 ;-) ) @MrWhite

标签: .htaccess restrict referer


【解决方案1】:
# serve everyone from specific-domain or specific-user-agent 
RewriteCond %{HTTP_REFERER} ^https?://www.specific-domain.com 
RewriteRule ^ - [L]

# everybody else receives a forbidden 
RewriteRule ^ - [F]

这确实会允许来自specific-domain.com 的链接请求(即此域是HTTP Referer)并阻止一切。但是,它也会阻止对您的静态资源的所有请求,这些请求来自您的站点,其中您的域Referer。因此,您还需要允许来自您的域的请求。

您还应该允许一个空的Referer 标头。 IE。直接请求,当用户在浏览器地址栏中键入 URL 时。另请注意,Referer 标头可以通过其他方式抑制,具体取决于原始网站设置的引荐来源网址策略。用户自己也可以覆盖Referer标头,所以依赖Referer标头是不可靠的。

尝试以下方法:

# Serve everyone from specific-domain (and internal requests)
RewriteCond %{HTTP_REFERER} ^https?://www\.your-domain\.com/ [OR] 
RewriteCond %{HTTP_REFERER} ^https?://www\.specific-domain\.com/
RewriteRule ^ - [L]

# everybody else receives a forbidden 
RewriteRule ^ - [F]

要允许空的Referer,包括一个附加条件:

# Serve everyone from specific-domain (and internal requests and empty referer) 
RewriteCond %{HTTP_REFERER} ^$ [OR]
RewriteCond %{HTTP_REFERER} ^https?://www\.your-domain\.com/ [OR] 
RewriteCond %{HTTP_REFERER} ^https?://www\.specific-domain\.com/
RewriteRule ^ - [L]

请注意,您当前在Referer 中允许httphttps。如果这始终是https,那么具体并删除?(可选量词)。 IE。 ^https://www\.specific-domain\.com/。并记住用反斜杠转义文字点。

【讨论】:

  • 它工作得非常好...非常感谢,如果您有更多的时间来帮我,我会对覆盖任何用户的引荐来源标头有多容易感兴趣?仅仅评估这种解决方案的可靠性意味着什么样的知识。
  • 用户可以安装浏览器扩展来覆盖/伪造Referer 标头。网站/用户可以编写脚本来发出 HTTP 请求并伪造Refererreferrer-policy 不允许“伪造”Referer(即设置为 anything),但它可以被抑制。因此,如果您确实允许空的Referer,那么其他网站只需设置严格的推荐人策略即可访问。但合法用户也可能会取消Referer。所以,如果你屏蔽了一个空的Referer,你也可能屏蔽了合法用户。
  • @MrWhite 很抱歉再次打扰您,但使用您的解决方案我发现了一个我不明白的问题:尝试访问我网站内的典型 URL (yourdomain.com/page) 时,我发现我可以访问没有限制吗?是因为我没有设置空的referer吗?还是因为“页面”没有像 html 这样的扩展名?如果你有提示?谢谢
  • “在我的网站内” - 您的意思是当您点击您网站上的内部链接到您网站上的另一个页面时?或者当你直接在浏览器地址栏中输入 URL 时?但是,是的,正如我在回答中所解释的那样,上述规则都允许这两个请求。
  • 您可以进一步限制这一点,并且在请求静态资源时仅允许您的域为 Referer - 但这将阻止用户浏览您的站点,如果这是必需的(除非您设置 cookie或者其他的东西)。或者不允许空的Referer 阻止直接请求(第一个示例) - 但Referer 标头可能会被用户阻止,因此您可能会阻止合法用户。澄清一下,这并没有提供任何真正的安全性,因为 Referer 标头不可靠并且很容易伪造。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
相关资源
最近更新 更多