Nginx secure link

Материал из poiuty wiki
Перейти к: навигация, поиск

С помощью nginx secure link - мы можем сделать для каждого пользователя временную ссылку с привязкой к IP.
Если пользователь не получил свою уникальную ссылку - он не сможет ничего скачать с нашего веб сервера.
Отредактируем nginx.conf

	location /get/ {
		rewrite /get/([a-zA-Z0-9_\-]*)/([0-9]*)/(.*)$ /s/$3?hash=$1&time=$2;
	}
	
	location /s/ {
	secure_link $arg_hash,$arg_time;
	secure_link_md5 "$secure_link_expires$uri$remote_addr secret";
		if ($secure_link = "") {
			return 403;
		}
		
		if ($secure_link = "0") {
			return 410;
		}
	}

Первый location переписывает ссылку.

http://p2pool.pl/get/lepus.png?md5=V1WdgliK_6Y4S1qDFr95wQ&expires=2147483647
http://p2pool.pl/get/V1WdgliK_6Y4S1qDFr95wQ/2147483647/lepus.png

Второй location проверяет md5 hash, ip, expires. Если все верно => отдает файл. Если нет => отдает 403 или 410.

Генерируем ссылки на PHP

<?php
$domain = 'http://p2pool.pl';
$secret = 'secret';
$time = time()+60*60*24;
$file = "lepus.png";
 
$key = str_replace("=", "", strtr(base64_encode(md5("{$time}/s/{$file}".getenv("REMOTE_ADDR")." secret", TRUE)), "+/", "-_"));
$url = htmlspecialchars("$domain/get/$key/$time/$file");
 
echo getenv("REMOTE_ADDR")."<br/>";
echo "<a href=$url target=_blank>$url</a>";

Download speed rate

Можем ограничить скорость скачивания для простых ссылок. Пример конфига nginx.

	location /get/ {
		rewrite /get/([a-zA-Z0-9_\-]*)/([0-9]*)/(.*)$ /s/$3?hash=$1&time=$2;
		rewrite /get/(.*)$ /s/$1;
	}
	
	location /s/ {
	secure_link $arg_hash,$arg_time;
	secure_link_md5 "$secure_link_expires$uri$remote_addr secret";
		if ($secure_link = "") {
			limit_rate 100k;
		}
		if ($secure_link = "0") {
			limit_rate 100k;
		}
	}

Все тоже самое, кроме return => меняем на limit_rate. Плюс добавляем дополнительный rewrite для простых ссылок.

Fast speed: http://p2pool.pl/get/sDeGQ3f2zYVXB6DXYD20HA/1424923271/debian-live-7.8.0-amd64-rescue.iso
Slow speed: http://p2pool.pl/get/debian-live-7.8.0-amd64-rescue.iso

В итоге по уникальным ссылкам - скорость скачивания файлов будет максимальная. А по обычным - 100K/s.

# wget http://p2pool.pl/get/sDeGQ3f2zYVXB6DXYD20HA/1424923271/debian-live-7.8.0-amd64-rescue.iso
 0% [                                                           ] 6,566,423   1.37M/s  eta 9m 12s

# wget http://p2pool.pl/get/debian-live-7.8.0-amd64-rescue.iso
 0% [                                                           ] 409,600      100K/s  eta 1h 55m