Как закодировать часть URL с использованием nginx

Вопрос или проблема

У меня есть раздел скачивания на моем сайте, пока что я даю посетителям ссылку для скачивания в такой схеме:

https://example.com/somerandomtext/file.zip

Я бы хотел зашифровать URL на уровне PHP до:

https://example.com/encrypted_somerandomtext/file.zip

И расшифровать на nginx, используя proxy_pass.

Код, который я использую для шифрования части somerandomtext, следующий:

<?php

function buildSecureLink($path, $secret)
{
    $md5 = md5(" $secret", true);
    $md5 = base64_encode($md5);
    $md5 = strtr($md5, '+/', '-_');
    $md5 = str_replace('=', '', $md5);
    return $md5;
}
$secret="the_secret_key_configured_in_nginx";
$path="SJTjYD4vJATWDsHtQLx6WsnH1aNYt2PxRL9t3hZ47X";
echo buildSecureLink($path, $secret);
?>

Как сделать так, чтобы nginx расшифровывал это и проксировал часть к правильному URL?

Спасибо.

Вы можете попробовать реализовать скрипт на Lua, который выполняет операцию расшифровки.

Однако, большая проблема здесь в том, что вы “шифруете”, создавая хеш фактического пути. Хеширование – это однонаправленная операция. Вы не можете вычислить исходное значение из хешированного.

Если вы хотите закодировать часть URL в NGINX, вы можете использовать переменную $uri вместе с директивой return или rewrite.
Например:
server {
listen 80;
server_name example.com;

location / {
    # Перенаправление на закодированный URL
    return 302 http://example.com/$(echo -n "your text to encode" | sed -e 's/ /%20/g');
}

}

Однако NGINX не предоставляет прямого метода для динамического кодирования конкретных частей URL. Вы можете решить эту задачу, используя скрипт или обратный прокси к промежуточному сервису, который кодирует URL.

Онлайн инструмент для кодирования URL
Если вы ищете быстрый способ вручную закодировать часть URL, вы можете воспользоваться онлайн инструментом, таким как URL Encode/Decode Tool. Это бесплатно и просто в использовании, что удобно для ситуаций, когда вам нужно протестировать или отладить закодированные URL.

.

Ответ или решение

Для решения вашей задачи с декодированием URL на уровне Nginx, необходимо учитывать, что текущий метод "зашифровки", используемый в PHP—не шифрование, а хеширование. Это важно, поскольку хеширование является однонаправленным процессом, что не позволит получить оригинальное значение из закодированного. Чтобы добиться необходимого результата, нужно реализовать процесс шифрования и дешифрования, а затем интегрировать его в конфигурацию Nginx.

Теория

Nginx сам по себе не поддерживает декодирование частей URL. Однако, это можно обойти с помощью использования дополнительных модулей, например, Lua. Lua-сценарии могут быть использованы для выполнения сложных операций, включая декодирование URL на стороне сервера. Кроме того, необходимо будет изменить метод шифрования с MD5-хеша на что-то, что поддерживает обратное преобразование, например, симметричное шифрование с использованием алгоритма AES (Advanced Encryption Standard).

Пример

  1. Шифрование в PHP.

    Вместо текущего подхода, использующего метод md5, рассмотрите возможность использования симметричного шифрования. Вот пример функции шифрования с использованием AES:

    function encrypt($data, $key) {
       $encryption_key = base64_decode($key);
       $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('AES-256-CBC'));
       $encrypted = openssl_encrypt($data, 'AES-256-CBC', $encryption_key, 0, $iv);
       return base64_encode($encrypted . '::' . $iv);
    }
    
    $secret = "the_secret_key_configured_in_nginx";
    $path = "somerandomtext";
    $encrypted_path = encrypt($path, $secret);
    echo $encrypted_path;
  2. Декодирование в Nginx с Lua.

    Чтобы настроить Nginx на декодирование URL, установите модуль ngx_http_lua_module, позволяющий использовать скрипты Lua. Пример декодирования в Lua:

    local function decrypt(data, key)
       local encrypted_data, iv = data:match("([^:]+)::([^:]+)")
       encrypted_data = ngx.decode_base64(encrypted_data)
       iv = ngx.decode_base64(iv)
       local decrypted = openssl.decrypt(encrypted_data, "aes-256-cbc", key, iv)
       return decrypted
    end
    
    -- Получение запроса и расшифровка
    local encrypted_path = ngx.var.uri
    local decrypted_path = decrypt(encrypted_path, "the_secret_key_configured_in_nginx")
    
    -- Перенаправление на расшифрованный URL
    ngx.exec(decrypted_path)
  3. Конфигурация Nginx.

    Вам потребуется отобразить сценарий Lua для обработки входящих запросов и перенаправления их на декодированные URL:

    server {
       listen 80;
       server_name example.com;
    
       location / {
           access_by_lua_block {
               local decrypted_path = decrypt(ngx.var.uri, "the_secret_key_configured_in_nginx")
               if decrypted_path then
                   ngx.var.target = decrypted_path
                   return ngx.redirect(decrypted_path)
               else
                   ngx.exit(ngx.HTTP_BAD_REQUEST)
               end
           }
           proxy_pass http://backend$target;
       }
    }

Применение

Придерживаясь предложенной схемы, вы сможете безопасно предоставлять зашифрованные URL, которые клиенты будут декодировать на сервере Nginx. Это повысит безопасность, так как исходная строка скрыта, и доступ к запрашиваемым файлам будет контролироваться через внутренние механизмы проверки.

Разумеется, важно учитывать, что использование шифрования может усложнить процесс управления и поддержания безопасности ключей шифрования. Ключи шифрования должны храниться в защищенном месте и не должны быть доступны посторонним системам или пользователям.

И наконец, помните, что запускаемый на сервере код всегда требует тщательного тестирования и валидации, чтобы избежать уязвимостей уровня безопасности.

Оцените материал
Добавить комментарий

Капча загружается...