Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Привязка к домену
Форумы портала PHP.SU » » Работа с сетью » Привязка к домену

Страниц (1): [1]
 

1. MAXUS - 16 Января, 2015 - 10:12:09 - перейти к сообщению
Сразу скажу, что отдаю отчет, что тема избитая, за что прошу простить, но встал вопрос ребром, как не дать работать коду на ином, кроме изначально установленного в коде домене. В общих чертах вопрос стоит, как защитить коммерческий код 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:
скопировать код в буфер обмена
  1. function check($host,$uri){
  2.         $fp = @fsockopen ($host, 80);
  3.         if (!$fp) return false;
  4.         else {
  5.                 $request = "HEAD {$uri} HTTP/1.0\r\n";
  6.                 $request .= "Host: {$host}\r\n";
  7.                 $request .= "Connection: Close\r\n\r\n";
  8.                 fputs($fp, $request);
  9.                
  10.                 //Выводим первую строку заголовка ответа
  11.                 echo fgets($fp,256).'<br />';
  12.                
  13.                 fclose ($fp);
  14.         }
  15.         return true;
  16. }


Если файл существует, то получаю отклик 200 OK достаточно быстро, так что при нормальной работе, скрипт не тормозит. Если же $_SERVER['SERVER_NAME'] подменили, то, соответственно, возникают тормоза, потому что fsockopen пытается установить соединение, но не может.

Первый вопрос: можно ли избежать указанных тормозов при работе с fsockopen? По идее не критично и возникают они, когда ставлю левый домен, которого не существует. В реальности вряд ли кому-то надо будет менять на не существующий. По идее, опять же, если сервера нет в природе, то такие тормоза будут полюбому, но вдруг все-таки есть решение, которого я не знаю? Таймаут, кстати ставил на 1 сек, но чето это не помогло.

Второй вопрос: как еще стандартными средствами можно проверить существование файла через запрос извне. Может, кроме fsockopen, есть более простой способ?

Третий вопрос: почему, когда файла нет (а домен есть), получаю 500, а не 404?

Буду признателен за подсказ по вопросам, а также прошу оценить подход в целом и, если кто-то видит подводные камни, то буду признателен за их выявление.

ЗЫ Чуть подправил текст. Переформулировал вопросы.
2. MAXUS - 16 Января, 2015 - 17:51:20 - перейти к сообщению
Не ожидал такой бурной реакцииУлыбка
3. esterio - 19 Января, 2015 - 18:03:20 - перейти к сообщению
1. виставить таймаут. идет запрос по домен которого не существует. у вас даже в браузере будут тормоза
2. есть сurl, file_get_contents
3. настройкы сервера нужно смотреть, что он отдает. вполне вероятно что перенаправляеться например на index.php который виваливаеться с ошибкой

 

Powered by ExBB FM 1.0 RC1