Вопрос или проблема
У меня есть раздел скачивания на моем сайте, пока что я даю посетителям ссылку для скачивания в такой схеме:
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).
Пример
-
Шифрование в 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;
-
Декодирование в 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)
-
Конфигурация 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. Это повысит безопасность, так как исходная строка скрыта, и доступ к запрашиваемым файлам будет контролироваться через внутренние механизмы проверки.
Разумеется, важно учитывать, что использование шифрования может усложнить процесс управления и поддержания безопасности ключей шифрования. Ключи шифрования должны храниться в защищенном месте и не должны быть доступны посторонним системам или пользователям.
И наконец, помните, что запускаемый на сервере код всегда требует тщательного тестирования и валидации, чтобы избежать уязвимостей уровня безопасности.