За последние 24 часа нас посетили 16929 программистов и 1635 роботов. Сейчас ищут 1698 программистов ...

Доступ к сайту с определённого домена

Тема в разделе "Сделайте за меня", создана пользователем akva, 27 дек 2014.

  1. akva

    akva Новичок

    С нами с:
    27 дек 2014
    Сообщения:
    4
    Симпатии:
    0
    Доброго времени суток!
    Прошу помочь, тк я не сильна в php...

    Как реализовать на php, чтобы сайт открывался
    только при переходе с определённого домена,
    а во всех остальных обращениях к сайту он был недоступен?

    Если можно... конкретный пример кода.
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    невозможно достоверно отследить переход С определенного домена так как эту строку можно случайно вообще не указать (режим инкогнито) или подделать.
    а вот обращение К определенному домену определить можно например так
    Код (Text):
    1. <?php
    2. $allow_dn = 'subdomain.example.com';
    3. if($allow_dn != $_SERVER['HTTP_HOST']){ exit; }
     
  3. ciamon

    ciamon Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    34
    Симпатии:
    0
    Добавлю только...
    Если нужно проверить зашёл ли пользователь напрямую или с какой-либо другой страницы сайта, то нужно использовать сессии.
    Если речь идёт о каком-либо веб-сервисе, который должен обрабатывать запросы только от определённого сайта, то нужно проверять IP-адрес.
     
  4. akva

    akva Новичок

    С нами с:
    27 дек 2014
    Сообщения:
    4
    Симпатии:
    0
    Спасибо, что ответили!
    Но отнеситесь ко мне как чайнику...

    Я хочу подключить в index.php сайта через include
    скрипт, чтобы выполнить описанное выше...
    Как это можно сделать?

    Вы пишите, что это очень ненадёжно... может подскажете,
    какие ещё есть варианты?

    Собственно задача заключается в том, чтобы несколько
    сайтов были доступны пользователям только после авторизации на Главном сайте.
    Вопрос с авторизацией и общей БД, более менее решён.
    Просто не знаю, что придумать... ведь все сайты доступны из Инета.
    Как сделать их недоступными... чтобы они ожили только после авторизации?
    Или я задумала что-то нереальное...

    Добавлено спустя 12 минут 11 секунд:
    Я нашла только Заптрет доступа с определённого домена:

    Код (Text):
    1. <?php
    2. if( strpos( $_SERVER['HTTP_REFERER'], 'ПЛОХОЙ_ДОМЕН.com' ) !== FALSE){
    3. header('Location: http://ВАШ_АДРЕС');
    4. exit();
    5. }
    6. ?>
    Проверила, всё работает, только вот
    если бы всё наоборот...
     
  5. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    что бы в идеале выполнить такую задачу без лишних заморочек, лучше использовать сессии( или куки) + AJAX... (o_O)
    надеюсь объяснять не стоит, и так понятно всё...))
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Например есть 3 сайта:
    example.com <- главный
    example.org
    example.net

    На example.com реализуй oauth или openid сервер.
    После авторизации, если пользователь зашел например на example.org ты его отправляешь на авторизацию по oauth к example.com и если он был авторизован, то вернёшь на example.org и тут тоже авторизуешь.

    Всё придумано до тебя. Читай oauth или openid сервер.

    Думаю тебе OpenID подойдёт, но лучше прочитай про отличие OAuth от OpenID https://ru.wikipedia.org/wiki/OAuth#.D0.9E.D1.82.D0.BB.D0.B ... .82_OpenID
     
  7. akva

    akva Новичок

    С нами с:
    27 дек 2014
    Сообщения:
    4
    Симпатии:
    0
  8. akva

    akva Новичок

    С нами с:
    27 дек 2014
    Сообщения:
    4
    Симпатии:
    0
    Вот нашла решение... всё оказалось очень просто.

    Для сайтов я использую движок DataLife Engine.
    Как оказалось в нём имеется возможность произвольно
    указывать "USERPREFIX"

    Единая регистрация и авторизация на нескольких сайтах
    http://dle-news.ru/tips/152-edinaja_registracija_i_avtorizacija_na_neskolkikh_sajjtakh.html

    Сделав всё как описано (см ссылку) в админке "дополнительных"
    сайтов указываю отключить сайт, предварительно разрешив
    пользователям просмотр отключенного сайта.

    Как вы понимаете, при вводе адреса этих сайтов отображается
    заглушка, там можно написать всё что угодно...

    Но после авторизации на Главном сайте, все они становятся
    доступны для просмотра.
     
  9. torrius

    torrius Активный пользователь

    С нами с:
    28 июн 2014
    Сообщения:
    35
    Симпатии:
    1
    если еще актуально:
    Код (Text):
    1.  
    2. <?php
    3. function validateReferer(){
    4.     // если набрали адрес в строке браузера, даем "добро" (true)
    5.     // или (false) если нужно и эту возможность запретить
    6.     if(!isset($_SERVER['HTTP_REFERER'])) return true;
    7.    
    8.     // список "хороших" доменов через запятую
    9.     $good_domens = explode(',', '
    10.    
    11.         test1.ru
    12.     ,   test2.net
    13.     ,   хороший-сайт.рф
    14.    
    15.     ');
    16.     $refer = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST);
    17.     foreach($good_domens as $domen){
    18.         if(trim($domen) == $refer) return true;
    19.     }
    20.     return false;
    21. }
    22. if(!validateReferer()) die('ERROR!');
    23. ?>
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    torrius, реферер подделывается... ну и без итерации цикла можно обойтись... и без тримов... короче так себе валидатор...
     
  11. torrius

    torrius Активный пользователь

    С нами с:
    28 июн 2014
    Сообщения:
    35
    Симпатии:
    1
    абсолютно согласен, однако был дан код:
    Код (PHP):
    1. <?php
    2. if( strpos( $_SERVER['HTTP_REFERER'], 'ПЛОХОЙ_ДОМЕН.com' ) !== FALSE){
    3. header('Location: http://ВАШ_АДРЕС');
    4. exit();
    5. }
    6. ?>
    и пожелание к нему:
    - теперь работает наоборот))
    опять согласен с Вами, особенно если не учитывать
    - ввиду этого и приходиться городить огород для удобства обслуживания кода "не сильными в PHP",
    например, чтоб удобно интегрировать новые названия доменов, где по случайности могут оказаться пробелы или переносы
    - еще раз согласен, только не могли бы и Вы представить Ваш
    уверен, он будет полезен многим, спасибо
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    как я уже сказал в данной реализации нет смысла - реферер подделывается. легко. следовательно не важно какая будет реализация валидатора. он всегда будет разрешать доступ.
    теперь рассмотрим минусы предложенного валидатора:
    1. не указан реферер - даём добро. и чо тут как защитка-то работает? примерно как стальная дверь в чистом поле - бессмысленно и беспощадно. я всегда буду ходить на эти сайты удаляя это поле из заголовка.
    2. список хороших доменов при каждом запросе будет разбиваться из строки в массив. зачем? оригинальное объявление массива лучше кешируется это раз и список меняется редко а эксплодить приходиться постоянно это два.
    3. мало того что на каждом запросе эксплодим список так еще и получаем непотребные данные которые потом требуют дополнительной обработки. и чем ниже был домен в списке тем больше итераций будет и тем больше лишних действий сделает пхп машина. и напомню что этот фарш - для каждого запроса. зачем?
    4. валидатор бесполезен, но это мы уже обсудили.

    плюсы валидатора. эм... я может быть чего-то не замечаю? ну типа предвзято отношусь. хотя аргументировано вроде. может автор соизволит указать мне на какие-то плюсы кроме фарша дающего возможность легко редактировать список? ну реально. имхо, проще обучить дебила-контент-менеджера добавлять элементы в пхп массив ведь делать ему это придется не так часто как бедной пхп машине разбирать кривой текст и каждый раз его нормализовывать для возможности с ним поработать.
     
  13. torrius

    torrius Активный пользователь

    С нами с:
    28 июн 2014
    Сообщения:
    35
    Симпатии:
    1
    Ganzal, Ваша конструктивная критика несомненно полезна, признаю, и все же:
    - может по IP разрешать надежнее с помощью htaccess типа:
    Код (Text):
    1. Order Deny,Allow
    2. Deny from all
    3. Allow from хороший-IP
    хотя не факт.
    Тогда что есть, что нельзя подделать в заголовках?
     
  14. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    torrius, посмотри как в OpenID сделана аутентификация
     
  15. torrius

    torrius Активный пользователь

    С нами с:
    28 июн 2014
    Сообщения:
    35
    Симпатии:
    1
    спасибо.
    Тогда, если у вас есть опыт с OpenID, быть может, вы выдерните этот важнейший фрагмент кода сюда? ;)
    Да и Ganzal критикует за каждую растраченную наносекунду на обработку кода - думаете пройдет одобрение монстр-OpenID?
     
  16. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    torrius, ты вообще понимаешь о чем речь идёт в теме?

    1. писать код валидатора реферера я не буду потому что уже сто раз сказал что такая проверка бессмысленна.
    2. ты умудрился из бессмысленной проверки еще и наговнокодить бесполезный но избыточный валидатор.
    3. что ты по айпи собрался разрешать? человек зашел на правильный домен, потом пошел на защищенный - ты будешь ждать его ип? где? то есть по факту ты в айчтиаксесе собрался перечислить все айпишники интернета, так что ли? ну чисто чтоб работала валидация. очередное необдуманное предположение. перечитай мою критику твоих бесполезных действий и попробуй убедить меня что ты головой подумал перед тем как их писать.
    4. многое можно подделать в заголовках. нельзя верить данным пришедшим от пользователя.
    5. у тебя опыта мало? ну тогда может не стоит давать решения если ты совершенно не понимаешь что ты написал и зачем?
    6. ну если уж дал то может тогда не стоит с пеной у рта доказывать что оно правильное при том что тебе уже по полочкам расписано почему это не так?

    Добавлено спустя 2 минуты 1 секунду:
    да, подойдёт. подобного рода задачи должны решаться подобного рода алгоритмами.
     
  17. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Там много кода, но логика проста, пользователь example.com заходит на example.org и его отправляют на example.com который знает пользователя и подтверждает это тем что пересылает опять на example.org. Это уж очень простое описание.

    Описание в wiki есть https://ru.wikipedia.org/wiki/OpenID
     
  18. torrius

    torrius Активный пользователь

    С нами с:
    28 июн 2014
    Сообщения:
    35
    Симпатии:
    1
    1. Так проверка бессмысленна или решение все же есть?
    2. Ни кто не настаивает на валидации реферер, просто покажите любой свой хоть мало-мальски действующий код. Пока что Вы доказали умение критиковать, но не кодить.
    3. Пусть некоторые чужие примеры по-Вашему рабочие на 0,001%. Ваша критика - это вообще даже не код и если ее использовать в качестве кода-примера: действенна на 0% ;) Давайте будем реалистами: 0,001% в бесконечное множество раз полезнее 0%.
    4. Текущая тема: "Сделайте за меня", а не "Сделай сам, придурок". Люди здесь ищут готовый рабочий вариант: "скопировал-вставил", а не бесконечный редирект на другие источники, и уж точно не встречных вопросов, типа: "Тупой что-ли?". Не умно как-то.
    5. К Вам, Уважаемый, обращаются на Вы, к чему ответная инфантильная дерзость? Я даже молчу о нашей разнице в возрасте.
    Ganzal, хочется верить, Вы, как программист, весьма продвинутый. И многие Вам искренне благодарны за Ваши посты. Быть может стоит попробовать от великого множества строк комментариев перейти к соответствующему числу строк полезного кода? Так сказать, перейти на более высокий качественный уровень?
    Если же Вам не понятно о чем я, примите мои извинения, просто априори посчитал Вас психически полноценным.

    Добавлено спустя 3 минуты 36 секунд:
    да, уже немного почитал, в т.ч. и про лайт версию. Кстати, и про уязвимости нашел.
    Несомненно, для серьезных проектов альтернативу искать бессмысленно. Приспичит - придется ковырять, никуда не денешься ;)))
     
  19. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    проверка по рефереру бесмысленна. реализация алгоритма наподобие оупенайди - подойдет. помидор красный у трактора дверь вот так открывается. вещи разные.

    Код (Text):
    1. <?php $_SERVER['HTTP_REFERER'] = 1;
    такой пример кода устроит? он такой же бессмысленный как и опубликованный ранее. откуда бессмысленность наследуется надеюсь не придется повторять?

    ай не, придется. реализация защиты по рефереру - бессмысленна. нормальная реализация поставленной задачи не делается по рефереру. нормальная реализация поставленной задачи выходит за рамки форума "сделай за меня". там не может быть двух строк кода который каждый психолог воткнёт в исходник и всё сразу заработает.
     
  20. ciamon

    ciamon Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    34
    Симпатии:
    0
    Ну топикстартер уже решил свою проблему и раз решение его устроило, то это просто замечательно.
    openid или oauth - это слишком громоздкие протоколы для данной ситуации. Я бы сделал иначе: после авторизации вставил бы скрытый фрейм, в котором грузил бы скрипт с другого сайта. Передавал бы в этот скирпт ид/логин пользователя. Ну и хеш код, конечно. Этот бы скрипт авторизовывал пользователя. И затем, когда пользователь перейдёт на сайт тем или иным образом, в кукисах уже будет ид сессии.