Пишу сервис обмена файлов типа webfile.ru, нужно было написать грамотный антиличер. Стал смотреть что уже есть (далее вырезка из моего дока на ННМ) 1. Первый - полностью скрывает местонахождения файла. Скрипт проверяет всякие данные (реферер там итп), потом генерит нужные заголовки и открывает файл в браузер, т.е. не редиректит на него, а прям открывает. Способ 100%, никаких проблем. Очень высокая гибкость, можно контролировать число потоков и много еще чего =) Минус в том, что... извените... открывать скриптом файл в 20 метров и отдавать его браузеру. Впринципе нет проблем, но если желающих много? =))) 2. Второй - тоже проверяет всякие данные, но потом просто редиректит пользователя на нужный файл. Т.е. пользователь узнает путь до файла, дает прямую линку и тьма народу его качает напрямую. это уже не антилич даже, но многие гордо пишут над такими скриптами, мол это все же антилич. Ну хз... Передо мной стоит задача сделать гибкий "жезл", но в то же время чтобы и работало все быстро... Возникло несколько идей, понимаю что америку я не открываю, но хотелось поделиться. 3. Сразу подумал о очень простом способе. Просто простом до оргазма! Все файлы хронятся в одной дире, имя которой меняется, скажем, раз в час. Скрипт узнать это имя может, юзер - нет. Т.е. полюбому нужно зайти на сайт антиличера, чтобы получить нужныю ссылку. И живой она будет только в течении максимум часа. Плюсов тут очень много. Например тот факт что файлы отдаются напрямую. При правиельной конфигурации сервака - вообще миную апач и прочее. Немного подумая я понял что этот способ не годится - чел качал качал файл, а он бац, и переместился. Типа закачка остановится. Решил что он не пойдет, расстроился и начал думать дальше. Блин, надо было сразу проверить этот способ =))) 4. Это вообще способ для полный психопатов =))) но все же =) Идея была такова. При заходе на сайт личера создается файл в каталоге, ну пусть, ./ip/ с IP адресом зашедшего. Имя файла - md5 хеш IP адреса + какого-то текста, постоянного. И кидается ссылка на файл вида http://hty683hcn70cj3hfgl7js6b8g0m4j6hd.antileech.ru/winrar.exe далее в конфиг апача с mod_rewrite прописываем несколько правил. Сначало RewriteCond, которая определит строку поддомена, затем RewriteMap подключит нужный нам файл из дериктории ./ip/ и прочтет соответственно IP. Затем снова парочка RewriteCond, которые сверят IP и, доппустим, реферера и только потом RewriteRule которая редиректит пользователя на нужный файл =)))) Способ не столь гибкий как первый, но зато нагрузка, думаю, значительно ниже. Только тут для каждого IP своя ссылка получается, хотя это тоже настраивомо... Так же из комментариев к этому посту: "можно так- ставятся два web сервера на машину - один за другим nginx и apache это сейчас уже становится классической связкой. uginx - веб сервер заточенный под статику. Работает схема так - *лисенер nginx сидит на 80м порту *получили запрос - передается апачу *апач выполняет скрипт (php например) *данные отдаются uginx - он отдает их пользователю. так работают скрипты статические файлы отдаются напрямую через nginx, что сильно снижает нагрузку с сервера. теперь, как отдать файл с защитой от личерства в такой системе - *nginx анастраивается, чтобы файлы из определенной директории отдавались через апач *далее - в апач вносится директива чтобы файлы отдавались через скрипт *в скрипте проверяем отдавать файл или страничку теперь самое интересное! скрипт не сам отдает файл а дает директиву в nginx и он сам дальше уже отдает файл клиенту (внутренний редирект) теперь к защите от личерства прибавляется: *возможность докачки *многопоточность *нагрузка как при отдаче статического файла именно такая система работает на slil.ru" На данный момент реализовывать буду примерно так. Есть дира, допустим /download/ в ней еще одна с рандомным именем. Так же в /download/ есть файл, допустим updir.php, содержащий текст: "<?$updir='yu43i';?>". Когда чел просит файл на сервере, допустим заходит по адресу "www.antileech.ru/winrar.exe.html" он видит дискламер, бла бла бла и линку на скачку. Ну там пасс если надо и так далее. Линка ведет еще на один скрипт. Этот скрипт сверяет все данные, инклудит updir.php и редиректит пользователя на www.antilieech.ru/download/$updir/winrar.exe, после этого меняет имя директории и запись в updir.php. Таким образом качать файл можно только в один поток ((вы уж извените, но обслуживать одновременно 100 юзверей, качающих в 10 потоков...), а так же при таком раскладе качки будут отдыхать. А так как директория меняется каждый раз после скачивания файла - отпадает вероятность подбора. Плюсов очень много. С одной стороны мы можем очень гибко опрашивать пользователя. Например просить у него пароль и так далее, но с другой стороны файл отдается напрямую. Т.е. если в первом случае будет сожрано куча ресурсов на открытие файла, то тут файл отдается как статика. Вот =) Может кому и пригодится
Первый способ однозначно=) из предложенных =) предположим, что много желающих, но разве нагрузка станет меньше, если вместо антиличера будет выдавать апач? нет, не станет =) она будет такой же Ну в крайнем случае не намного... (при условии, что антиличер не кривой). Способ 5: Скрипт(а точнее программа на с/с++) написана под определенные нужды. Слушает порт и... Имхо цель не оправдывет средства. Плохой способ. Способ 6: мод_перл: в конфигах апача можно писать на перле: т.е. конфиг будет являться полноценной программой =) Имхо рулит.
Способ 6 - не согласен. Точно так же мод_пхп. Насчет первого случая я уже говорил - весь файл (предполоим это 20 метров) открыавается скриптом и отдается в браузер. Напиши такой скрипт и открой пару десятков окон =) В моем случае файл отдается не апачем (хотя даже если отдавать его апачем - это намного экономичнее чем первый способ) а как статика минуая апач. Как заметил ecto (чей коммент я привел, автор slil.ru) уже давно бытует связка прокси nginx и апача. nginx отдает всю статику и запускает процесс апача только при обращении к скриптам. Мой способ и способ ecto достаточно схожи, только в моем случае все проще, но на самом деле его способ более економичен к ресурсам... вроде как.
Я бы делал самым экономичным способом =) И самым геморным =\ Эх... #include <iostream> #include <mysql.h> ...
=))) Все же самый экономичный способ - отдавать файлы статикой (если мы говорим о отдаче файлов через http). Я думал это очевидно =) Легче статики быть ничего не может. Тем более если мы учитываем что целый день пользователи только и будут делать что качать файлы =) в 10 потоков =))) Да так везде и сделано, http://www.ritlabs.com/download/the_bat/thebat_pro_3-51.msi вот пример. Просто задача антиличера - сделать возможным качать файл только из одного места (в данном случае сайт антилича). А насчет последнего способа твоего я так и не понял =) там где про iostream =)
Статика. Ну не может маленькая прога жрать больше ресурсов чем апач =) (если руки не прямые) свой маленький сервер =) это 5 способ =)
nerezus, повторяю, в моем случае процесс апача не запускается, он не нужен =) Если ты говориш о написании своего сервера под это - это и есть способ ecto. Если я правильно все понял... Т.е. ты предлогаешь замену апачу - так и сделано. Висит nginx который почти нефига не жрет и н же отдает файлы вместо апача. Толко в моем способе сначало идет проверка - потом отдача, а в способе ecto немного подругому. Если у тебя получится написать свой мини сервак на эту тему - будет очень интересно =)
Не, перл не считается =) Перл все же язык более высокого уровня чем c++, выгоды будет не много =) Хотя чисто для развития было бы интересно поглядеть как это выглядит на перле =) Если не в падляк =)
Перл вроде и раньше был компилируемый, но я могу ошибаться =)) Вообщем, как ты понял, прога должна принимать параметры, сверять их и отдавать файл из указанной диры, нужно иметь возможность контролировать трафик (кол-во потоков, ограничение по скорости в зависимости от региона итп). И если все ок, то можно будет двигать продукт как очень не плохой аналог nginx для сайтов-антиличеров. Может показаться сложным ограничивать трафик\скорость в зависимости от географии пользователя, на самом деле там должно быть все очень просто. Главное написать ограничитель по скорости, а табличку "диапазон_IP - география пользователя" достать не сложно =)
все кроме ограничения трафика пишется парой строк =) с ограничением трабла... стандартные модули не смогу переписать, умения наверно не хватит...
Не ограничение по трафу я хотел сказать, а по скорости. тут ничего тоже сложного быть не должно. Просто скорость ограничить сможешь? Например через каждые 20 послыннах килобайт делать sleep() на там пол секунды. Расчитать влияние пропорции времени задержки на скорость скачивания и все =)
А если чанками отдавать:? то етсь не грузить 20 метров для каждого желающего, а как для докачки -- допустим выкачал 200 Кб, подгрузил еще 200.
Прорсто допиши в хидер страницы Accept-Ranges: bytes Content-Length: <размер_файла_в_байтах> Content-Type: text/plain (see HTTP RFC) а дальше просто как не в чём не бывало выводи в браузер содержимое файла, т.к. пользователя редиректить на файл напрямую не будет, УРЛ он не узнает, а для браузера или довнлод-мененджера вообще не будет разницы, что ты передаш ему файл таким способом, что укажеш урл вроде site.ru/downloads/file.rar ой, а где тут антилич? =) зачем же так над собой изврашаЦЦа =) а если у тебя несколько пользователей будут качать один архив весом метров этак 200, то здесь никакой дисковой квоты не хватит =)