apache .htaccess语句“require host.”是否与实际的客户端和/或跨域服务器相关,托管一些静态front_end?

yb3bgrhw  于 2023-10-23  发布在  Apache
关注(0)|答案(1)|浏览(147)

假设我有

a)在foo.com上运行的一些 * 后端 * API
**B)**一些基于JavaScript的静态 front_end,由baa.com提供,通过获取请求从foo.com调用API
**c)**一些特殊的 * 客户端 * C,ip为xy
**

我想创建一些.htaccess文件,始终允许baa.com上的 front_end 调用 back_end API。我希望能够指定哪些客户可以看到的结果。例如,不应允许客户端直接使用 back_end API,而只能通过baa.com使用。
=>从foo.com的Angular 来看:这些请求从何而来?
因为JavaScript fetch命令是在客户端的浏览器中执行的,所以请求的来源总是 * 客户端 * 吗?baa.com是原点吗?或者有办法区分这两种“起源”吗?foo.com.htaccess是否“知道”front_end 已由baa.com提供服务,client 请求来自ip xy
foo.com.htaccess文件的示例内容:

AuthUserFile /usr/www/users/foo/.htpasswd
AuthName "Password Protected Area"
AuthType Basic

Require valid-user
Require host foo.com  # <= host of client or host of cross-orgin front_end ?
Require ip xy

相关信息:
https://httpd.apache.org/docs/2.4/howto/access.html

lztngnrs

lztngnrs1#

在CBroe和一些KI的评论的帮助下,我找到了下面的答案。如果我理解正确的话,我真的不能保证,只有www.example.com引用的请求baa.com才能在foo.com上被允许。

**A.**在www.example.com上的.htaccess文件的上下文foo.com,一些Require host example.com语句指的是向foo.com发出请求的客户端的主机。在这种情况下,主机属于客户端IP地址的域或客户端DNS解析的域。

前端托管在www.example.com上baa.com,与foo.com上的.htaccess文件中的Require host语句没有直接关系。该语句关注于请求的源,即访问foo.com的客户端。
因此,foo.com上的.htaccess文件中的某些Require host example.com指令确保只有来自主机/域example.com的请求才允许访问foo.com上的资源。

**B.**为确保baa.com只允许来自foo.com的请求,您可以实施一系列技术来增强应用程序的安全性和完整性。

1.引用者标题检查:虽然Referer头可以伪造,但您仍然可以执行基本检查以验证请求是否来自baa.com。在www.example.com上的服务器端代码中foo.com,检查Referer头值,并将其与https://baa.com的预期值进行比较。如果它们匹配,则允许请求继续;否则,予以拒绝或相应处理。
1.跨域资源共享(CORS):在foo.com的服务器端实现CORS,以控制允许哪些域向API发出请求。将服务器配置为仅允许来自www.example.com的baa.com使用Access-Control-Allow-Origin头的请求。这提供了额外的安全层,并确保只允许来自baa.com的请求。但是,“Origin”头也可以伪造。
1.身份验证和授权:在www.example.com上实现健壮的身份验证和授权机制foo.com。这可能涉及用户身份验证、会话管理和基于角色的访问控制。通过要求用户进行身份验证,您可以确保只有经过授权的用户才能访问foo.com上的资源,而不管授权者是谁。
1.安全通信:确保客户端(浏览器)和foo.com(API)之间的通信是通过使用HTTPS的安全连接完成的。这有助于防止潜在的网络窃听,并确保请求的完整性。
通过结合这些技术,您可以增强应用程序的安全性,并最大限度地降低未经授权访问foo.com的API的风险。但是,需要注意的是,决心已定的攻击者仍然可以找到绕过这些措施的方法,因此始终建议您采取额外的安全措施并进行监控。

至B。1.

Referer标头提供有关导致客户端发出请求的引用URL的信息。您可以检查.htaccess文件中的Referer头值,以验证请求是否来自baa.com。
下面是一个示例,说明如何使用.htaccess文件中的Referer头来允许从baa.com引用的请求:
RewriteEngine在RewriteCond %{HTTP_REFERER}上!^https:baa.com [NC] RewriteRule ^ - [F]
在本例中,RewriteCond指令检查HTTP_REFERER变量(包含Referer标头值)是否不以https?://baa.com开头。NC标志使比较不区分大小写。
带有[F]标志的RewriteRule用于返回403 Forbidden状态码,并阻止对任何不满足条件的请求的访问。
通过将此代码包含在www.example.com上的.htaccess文件foo.com,仅允许将baa.com作为引用URL的请求访问foo.com上的资源。来自任何其他引用URL的请求将被阻止。
客户端可以在请求中伪造Referer头。Referer报头是HTTP请求的一部分,客户端可以修改甚至省略。
客户端可以使用各种方法或工具来修改Referer标头,包括浏览器扩展、自定义脚本或直接使用cURL或Postman等工具发送请求。这意味着仅仅依靠Referer报头来实现安全或访问控制目的并不完全可靠。

To B. 2.Origin报头用于跨域资源共享(CORS),攻击者可能会伪造此报头。Origin头由客户端的浏览器设置,客户端可以修改或操作。

攻击者可能会修改请求中的Origin标头,使其看起来好像来自baa.com,即使它不是。这就是所谓的跨域请求伪造(CSRF)攻击。
为了降低CSRF攻击的风险,建议将Origin标头与其他安全措施合并使用,例如:

1.正确的身份验证和会话管理:实现健壮的身份验证机制,并确保每个请求都包含有效的会话令牌或其他身份验证凭据。

  1. CSRF代币:在表单或API请求中生成并包含CSRF令牌。这些令牌在每个会话中应该是唯一的,并在服务器端进行验证,以确保请求是合法的。
    1.同站点Cookie:设置cookie的SameSite属性,以防止它们在跨站点请求中发送。这有助于防范依赖于基于Cookie的身份验证的CSRF攻击。
    通过实施这些额外的安全措施,您可以增强对CSRF攻击的保护,并确保baa.com只允许来自www.example.com的合法请求。

相关问题