htaccess Secret.json 从给定的 javascript(服务工作者)文件访问文件

问题描述 投票:0回答:1

如何在htaccess文件中检查只有serviceworker.js可以访问secret.json文件? 主机或IP地址过滤不好。 我正在寻找一个 Vanilla JS 解决方案,只允许服务工作者读取文件

.htaccess 文件

Options All -Indexes
ServerSignature Off

SetEnvIf Referer ".example\.com" localreferer

<FilesMatch "\.json$">
    Require all denied
    Require env localreferer
</FilesMatch>

SetEnvIf Referer“serviceworker.js”swjsreferer?????? :S

秘密.json

{
'name': 'test'
}

服务工作者.js

        await fetch('https://example.com/secret.json', {
          }).then(response => {
            return response.json();
          })
          .then(data => {
            console.log(data);
          })
          .catch(error => {
            console.log(error);
          });              
javascript .htaccess service-worker
1个回答
0
投票

@Arkascha 是对的。 Jani88,为什么不使用“文件管理器”页面来轻松管理这些条件呢?例如,您可以编写一个处理 example.com 站点的 PHP 脚本。您需要将所有请求重定向到

index.php
,然后创建一个路由器。其中一条路线可能是
secret.json
。当我调用
example.com/secret.json
时,
index.php
开始运行,检查路径是否为
/secret.json
,验证 IP 地址,如果正确,PHP 可以直接读取 JSON 文件并在响应中返回。如果IP地址不正确,可以输出403错误。

.htaccess

PHP

.htaccess
标准,我们禁用目录列表并确保所有请求(包括
/login
/register
等路径)始终执行特定的
index.php
文件,我们从中处理最终输出。

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

index.php

根据每个请求运行的主文件。我添加了一些函数以使其更容易理解。目前,它仅以非常基本的方式检查一条路线,只是为了逻辑起见,看看请求的链接是

example.com/secret.json
还是
example.com/secret.json/
。如果是这样,在检查 IP 地址后,它会回显 JSON 文件的内容。

<?php

// List of allowed IP addresses
$allowed_ips = ['70.80.70.80'];

// Function to get the client's IP address
function getClientIp() {
    return $_SERVER['HTTP_CLIENT_IP'] ?? $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'];
}

// Function to send a error response
function abort($code, $message = null) {
    $default_messages = [
        403 => '403 Forbidden',
        404 => '404 Not Found',
    ];
    header("HTTP/1.1 $code " . ($default_messages[$code] ?? 'Error'));
    echo $message ?? $default_messages[$code] ?? 'Error';
    exit();
}

// Get the requested path
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

// Route the request
if ($path === '/secret.json' || $path === '/secret.json/') {
    $client_ip = getClientIp();

    // Check if the client's IP address is allowed
    if (in_array($client_ip, $allowed_ips)) {
        // File path to the JSON file
        $file_path = __DIR__ . '/storage/secret.json';

        if (file_exists($file_path)) {
            header('Content-Type: application/json');
            echo file_get_contents($file_path);
        } else {
            abort(404, 'File Not Found');
        }
    } else {
        abort(403);
    }
} else {
    abort(404);
}
© www.soinside.com 2019 - 2024. All rights reserved.