Посетитель
Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011
Помог: 7 раз(а)
|
Сразу скажу, что отдаю отчет, что тема избитая, за что прошу простить, но встал вопрос ребром, как не дать работать коду на ином, кроме изначально установленного в коде домене. В общих чертах вопрос стоит, как защитить коммерческий код php, но это явно тема для холивара и ее, насколько помню, просили не поднимать. В связи с этим изложу конкретную (не общую) часть подхода и предвосхищу некоторые моменты.
1. Вопрос об изобретении велосипедов, и вопрос о том, кому нафиг нужен мой или чей-то еще код, а также предложения находить радость в том, что он хоть кому-то нужен прошу считать в данной ветке офтопом.
2. Собственно, алгоритм.
Есть точка входа в скрипт - это функция с параметрами. Все, что происходит, происходит в ней, в том числе проверка на домен. Будем считать, что изменить функцию и все классы, которые в ней запускаются злоумышленник не сможет (обфускация и т.п.). Основной проблемой при привязке к домену является тот факт, что $_SERVER['SERVER_NAME'] можно подменить до входа в скрипт. Собственно, вопрос в том, чтобы скрипт определял была ли произведена подмена.
Как решается в общих чертах.
а) Запись определенного файла на сервер как-то так $_SERVER['DOCUMENT_ROOT'].путь_к_файлу
б) Проверка его через http по пути $_SERVER['SERVER_NAME'].путь_к_файлу.
Если по http получаем 200 OK, значит $_SERVER['SERVER_NAME'] можно верить, если до входа в скрипт $_SERVER['SERVER_NAME'] было изменено, то по http 200 OK уже никак не получить и тогда считаем, что $_SERVER['SERVER_NAME'] верить нельзя. Таким образом, решаем ключевой вопрос по обходу привязки к домену. Остальное - дело техники.
В принципе, код набросал и он в общих чертах работает так:
Файл по http проверяю через fsockopen(), потому что эта функция по идее интегрирована в php. Запрашиваю только заголовки. Чтобы быть уверенным, что доступ к файлу снаружи не будет блокирован, размещаю в этой же папке .htaccess с доступом конкретно к этому файлу (все остальные запросы извне блокируются в корневом каталоге скрипта).
Функция запроса по http примерно такая:
PHP:
скопировать код в буфер обмена
function check($host,$uri){ if (!$fp) return false; else { $request = "HEAD {$uri} HTTP/1.0\r\n"; $request .= "Host: {$host}\r\n"; $request .= "Connection: Close\r\n\r\n"; //Выводим первую строку заголовка ответа echo fgets($fp,256).'<br />'; } return true; }
Если файл существует, то получаю отклик 200 OK достаточно быстро, так что при нормальной работе, скрипт не тормозит. Если же $_SERVER['SERVER_NAME'] подменили, то, соответственно, возникают тормоза, потому что fsockopen пытается установить соединение, но не может.
Первый вопрос: можно ли избежать указанных тормозов при работе с fsockopen? По идее не критично и возникают они, когда ставлю левый домен, которого не существует. В реальности вряд ли кому-то надо будет менять на не существующий. По идее, опять же, если сервера нет в природе, то такие тормоза будут полюбому, но вдруг все-таки есть решение, которого я не знаю? Таймаут, кстати ставил на 1 сек, но чето это не помогло.
Второй вопрос: как еще стандартными средствами можно проверить существование файла через запрос извне. Может, кроме fsockopen, есть более простой способ?
Третий вопрос: почему, когда файла нет (а домен есть), получаю 500, а не 404?
Буду признателен за подсказ по вопросам, а также прошу оценить подход в целом и, если кто-то видит подводные камни, то буду признателен за их выявление.
ЗЫ Чуть подправил текст. Переформулировал вопросы.(Отредактировано автором: 16 Января, 2015 - 10:49:04)
|