限制浏览某些资源
restrict browsing to some resources
我有一个网站 (angular) 托管在 apache 服务器上,出于安全目的我想拒绝访问某些路径
网站目前是这样组织的
index.html
polyfills.js
scripts.js
main.js
package.json
styles.css
assets
configuration
configuration.json
styles
images
我想限制 url 访问 configuration.json , package.json
我试图在我的 .htaccess 中添加一条规则进行测试
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /myapp/
RewriteRule ^index.html$ -[L]
RewriteRule ^refresh.html$ -[L]
# added rule
RewriteRule (^|/)configuration.json(/|$) - [F]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.html [L]
</IfModule>
它正确地禁止使用路径 /myapp/assets/configuration/configuration.json 但它也阻止其他资源(如 main.js 和 polyfills.js)使用我配置文件不想,因为浏览器控制台出错,我无法再访问该网站
我只想禁止直接url访问
浏览器控制台日志
polyfilles.js : GET http://xxxx/myapp/assets/configuration/configuration.json 403 (Forbidden)
main.js : ERROR () => new Error('Error retrieving configuration file. ' + error)
我怎样才能避免这种情况?
非常感谢
如果资源需要从客户端访问(使用 JavaScript),则不能阻止客户端访问资源。因此,如果不限制所有客户端访问(例如 user/password 身份验证),您的要求实际上是不可能的,但是任何经过身份验证的用户仍然可以访问这些文件。
您可以通过使用自定义 HTTP 请求 header 自定义 client-side 请求来防止“随意”直接访问,并在 .htaccess
中检查此 header,否则阻止.但是,这取决于当前调用这些文件的方式,因为它需要更新您的 JS 代码。
例如,在请求 package.json
或 configuration.json
时,您还发送了一个 HTTP 请求 header,例如 X-Custom-Header: some-value
。
在 .htaccess
中,您可以阻止没有此 header 的请求(或者它不是正确的值)。例如:
RewriteCond %{HTTP:X-Custom-Header} !^some-value$
RewriteRule (^|/)(package|configuration)\.json$ - [F]
这只会阻止随意的直接访问,即。有人直接在浏览器地址栏中输入 URL。由于文件仍然下载到浏览器,用户仍然可以在浏览器(开发工具)中读取文件。如果有人愿意,header 也可以很容易地伪造。所以,这并不能提供任何真正的安全。
而不是发送自定义 HTTP 请求 header,您或许可以检查 Referer
header(如果为此类请求设置了此项)。但是,这不太可靠,因为可以将浏览器配置为不发送 Referer
header。而且,这很容易被伪造。
我有一个网站 (angular) 托管在 apache 服务器上,出于安全目的我想拒绝访问某些路径
网站目前是这样组织的
index.html
polyfills.js
scripts.js
main.js
package.json
styles.css
assets
configuration
configuration.json
styles
images
我想限制 url 访问 configuration.json , package.json
我试图在我的 .htaccess 中添加一条规则进行测试
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /myapp/
RewriteRule ^index.html$ -[L]
RewriteRule ^refresh.html$ -[L]
# added rule
RewriteRule (^|/)configuration.json(/|$) - [F]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.html [L]
</IfModule>
它正确地禁止使用路径 /myapp/assets/configuration/configuration.json 但它也阻止其他资源(如 main.js 和 polyfills.js)使用我配置文件不想,因为浏览器控制台出错,我无法再访问该网站
我只想禁止直接url访问
浏览器控制台日志
polyfilles.js : GET http://xxxx/myapp/assets/configuration/configuration.json 403 (Forbidden)
main.js : ERROR () => new Error('Error retrieving configuration file. ' + error)
我怎样才能避免这种情况?
非常感谢
如果资源需要从客户端访问(使用 JavaScript),则不能阻止客户端访问资源。因此,如果不限制所有客户端访问(例如 user/password 身份验证),您的要求实际上是不可能的,但是任何经过身份验证的用户仍然可以访问这些文件。
您可以通过使用自定义 HTTP 请求 header 自定义 client-side 请求来防止“随意”直接访问,并在 .htaccess
中检查此 header,否则阻止.但是,这取决于当前调用这些文件的方式,因为它需要更新您的 JS 代码。
例如,在请求 package.json
或 configuration.json
时,您还发送了一个 HTTP 请求 header,例如 X-Custom-Header: some-value
。
在 .htaccess
中,您可以阻止没有此 header 的请求(或者它不是正确的值)。例如:
RewriteCond %{HTTP:X-Custom-Header} !^some-value$
RewriteRule (^|/)(package|configuration)\.json$ - [F]
这只会阻止随意的直接访问,即。有人直接在浏览器地址栏中输入 URL。由于文件仍然下载到浏览器,用户仍然可以在浏览器(开发工具)中读取文件。如果有人愿意,header 也可以很容易地伪造。所以,这并不能提供任何真正的安全。
而不是发送自定义 HTTP 请求 header,您或许可以检查 Referer
header(如果为此类请求设置了此项)。但是,这不太可靠,因为可以将浏览器配置为不发送 Referer
header。而且,这很容易被伪造。