Делимся секретами создания сайтов

Как узнать с какого сайта был вызван скрипт?

Есть вот такая задачка:

на сайтеhttp://sitename.com есть скрипт test.php который генерирует картинки
есть 2 других сайта

http://site1.com

и

http://site2.com

на которых я размещаю тег

<img src="http://sitename.com/test.php">

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

Ответы: 32 → “Как узнать с какого сайта был вызван скрипт?”

  1. Дмитрий Александрович Ответить

    В генератор картинки:
    if ($_SERVER['HTTP_REFERER']=='site1.com') {картинка1} else {картинка2}

    Будет работать, если только у юзера запрашивающего <img src="http://sitename.com/test.php"> будет включена передача REFERER

  2. Игорь Яценко Ответить

    а как понять включена у него передача REFERER
    я так понимаю это в настройках браузера задается

  3. Вадим Чиняев Ответить

    реферер в новых браузерах по умолчанию есть
    либо в картинках <img src="http://sitename.com/test.php?site=1">
    <img src="http://sitename.com/test.php?site=2">

  4. Александр Тарантей Ответить

    секунду, REFERER Приходит если мы попали на эту страничку по ссылке или после заполнения формы

  5. Игорь Яценко Ответить

    >>реферер в новых браузерах по умолчанию есть
    >>либо в картинках <img src="http://sitename.com/test.php?site=1">
    >><img src="http://sitename.com/test.php?site=2">
    нет, с параметром не катит
    нужно автоматически определять

  6. Дмитрий Александрович Ответить

    #6 Реферер выключен если $_SERVER['HTTP_REFERER'] – возвращает пустое значение

  7. Арчи Шаги Ответить

    рефер легко подделывается…я бы не стал на него че-нить вешать =/

  8. Дмитрий Александрович Ответить

    #8 Ну тут же не стоит вопрос безопасности, а всего лишь вывод картинки

  9. Alexander Zubakov Ответить

    Если это, допустим, CAPTCHA, то вопрос безопасности еще как стоит.

  10. Плиско Вячеслав Ответить

    #10 и толку что подделают?

  11. Alexander Zubakov Ответить

    Так вот и смысл – достоверно определить, что изображение размещено на определенном сайте, а не на каком-нибудь другом.

  12. Плиско Вячеслав Ответить

    А кто сказал что картинка размещена на сайте.
    Суть в том, что картинка как раз не размещена на сайте, а размещается в браузере на компьютере пользователя, а тот в свою очередь берёт картинку с какими ему хочется заголовками и передаёт какую угодно информацию

  13. Alexander Zubakov Ответить

    #13, Плиско AmdY Вячеслав: "А кто сказал что картинка размещена на сайте.
    Суть в том, что картинка как раз не размещена на сайте, а размещается в браузере на компьютере пользователя"

    Интересная терминология (: Так можно сказать, что любые данные размещены не на сайтах, а у пользователей в браузерах =)

    Ну да не в этом дело, я понял что Вы хотели сказать. Даже больше, не "браузер", а, "клиент", в качестве которого может выступать любое ПО, получающее с сервера изображение.

    Допустим такой вариант. Есть страница, на которой размещено изображение. Страница устанавливает клиенту некую переменную сессии, значение которой случайно и сложно угадывается. Изображение, по сути, программа, получает значение этой самой переменной и сверяет с тем значением, которое хранит сервер для данного пользователя. Реализуется в PHP через сессии без проблем.

    Тогда, перед тем, как получить изображение, клиенту придется посетить страницу, на которой изображение размещено. Чтобы исключить варианты, когда один код используется для многих картинок, этот код делается одноразовым, быстро устаревающим, плюс контроль IP-адреса и значения UA.

    Однако, возможен следующий вариант. Сервер, на котором размещается специальное ПО, получает страницу, потом изображение, действуя, при этом, аналогично браузеру. ПО на этом сервере, получив изображение, показывает пользователю не это изображение, а его копию. Пользователь на другом сайте вводит текст с картинки, который отправляется серверу, а тот, в свою очередь, уже от своего имени отправляет данные странице с изображением, имитируя таким образом работу пользователя в браузере.

  14. Плиско Вячеслав Ответить

    нет комментариев, ты хоть читал что автору нужно?

  15. Alexander Zubakov Ответить

    Конечно. Но тема уже давно перешла в другое русло.

  16. Плиско Вячеслав Ответить

    Ну, тогда прочитай что сам написал, комментироватьчто не так не буду, попытайся реализовать ;)

  17. Alexander Zubakov Ответить

    #17, Плиско AmdY Вячеслав: "Ну, тогда прочитай что сам написал, комментировать что не так не буду, попытайся реализовать ;) "

    Говно-вопрос! Забирай: http://pub.kolonist.ru/hkmvd.zip и тестируй сам, так как технологию я испытывал на примере гостевухи офф. сайта, кхм, ну, в общем, сам разберешься.

  18. Плиско Вячеслав Ответить

    пилин.
    индуский код, ручной ввод капчи с другого сайта, ты работаешь в такой конторе http://www.webplanet.ru/news/security/2008/09/03/ind...
    >нет, с параметром не катит
    >нужно автоматически определять
    а ты предлогаешь ещё покруче.
    а твой скрипт можно значительно упростить
    <img src="http://www.hcmvd.ru/user/captcha.php?id=<?=md5(session_id())?>"/>
    и в коде проверки
    $code = file_get_contents('http://www.hcmvd.ru/user/captcha_code.php?id='.md5(session_id());
    if ($_POST['img_text'] == $code)

  19. Alexander Zubakov Ответить

    А реферер ты куда денешь? Капча "посмотрит", что ее вызывают с какого-то левого сайта и пошлет куда подальше. Браузер не трогаем, так как все наши манипуляции для пользователя должны быть незаметны.

    И что за скрипт http://www.hcmvd.ru/user/captcha_code.php, которого нету?

    md5(session_id()) – это вообще что? Сессия заводится на моем сайте, а другому серверу отправляется отправляется ее md5??? Да еще и с каким-то параметром id, который скрипту нафиг не нужен…

    Показывать капчу как картинку с другого домена (<a href="http://…), а форму отправлять сервером не получится, так как может стоять проверка на IP.

    Обойтись без предварительного получения страницы, которая устанавливает сессию тоже нельзя, так как капча может проверить сессию на существование, и, если ее еще нет, послать подальше, а не заводить новую.

    Задача-то в чем. Есть некий сайт, с неизвестными внутренностями, но мы предполагаем, что капча защищена по-максимуму. Т.е., проверяется реферер, проверяется, чтобы сначала загружалась сама страница и только потом капча, проверяется сессия на предмет кражи SESSID. Так вот в таком случае ПО на сервере должно полностью имитировать работу браузера пользователя, что и сделано.

  20. Плиско Вячеслав Ответить

    итак, фокус.
    твой сайт генерит html в котором на месте капчи генерит тег img с сырцом указывающий на сайт капчу, дополнительно посылаем хэш сессии и имя сайта, и желательно рандомное число <img src="http://www.hcmvd.ru/user/captcha.php?id=<?=md5(session_id())?>?site=test.ru&r=<?mt_rand();?>"/> скрипт captcha.php генерит картинку выплёвывает её, записывает параметры – кэш => тект капчи и убивает старое значение, если есть.captcha_code.php берёт значения капчи для данного ключа.
    в итоге, мы избавились от курла. ускорили скорость работы обоих скриптов – первый за счёт того, что не нужно запрашивать картинку курлом плюс когда строится страница в img подтягивается картинка. второй скрипт избавляется от нагрузки засчёт старта сессии, что очень важно, потому что сервер капчи будет более нагружен

  21. Alexander Zubakov Ответить

    Вот и реализуйте. А потом сообщите мне результат. Хотя я Вам сразу скажу, что его не будет. Потому что скрипту http://www.hcmvd.ru/user/captcha.php вообще не знакомы параметры id, site, r – ну не нужны ему эти параметры, не принимает их скрипт. Все, что можно отправить этому скрипту – PHPSESSID. И менять этот скрипт мы не можем, потому как вообще не имеем никакого отношения к тому сайту.

    Мы вообще о разных вещах говорим. Неужели не очевидно, что я говорю о случае, когда капча вообще не наша, и к ней мы не имеем никакого отношения, менять ее код мы не можем! Наша задача – заюзать картинку на любом сайте так, чтобы родной сайт капчи не заметил подмены.

  22. Плиско Вячеслав Ответить

    > Неужели не очевидно, что я говорю о случае, когда капча вообще не наша
    это я заметил уже давно, когда ссылку на ручной ввод давал, у вас пол программы уже написано, остаётся овтозаполнение форм, а для воода только поле капчи.
    но здесь же задача стаяла на 180% противоположная – сообщить другому серверу откуда берутся данные. у тебя мысли слишком далеко убежали от темы, чтобы отследить их ход.

  23. Alexander Zubakov Ответить

    #23, Плиско AmdY Вячеслав: "но здесь же задача стаяла на 180% противоположная"

    Так вот я о чем и говорю все это время – никаким способом нельзя достоверно уберечь изображение от его представления на другом, так сказать, несанкционированном, сайте.

  24. Плиско Вячеслав Ответить

    ты только ссылочку на архив убери,нефик хацкеров плодить

  25. Alexander Zubakov Ответить

    Я сам архив убрал, сразу, как понял, что ты скачал. Так что пущай по ссылке переходят :)

  26. Алексей Некторович Ответить

    2 Alexander у тебя хоть раз крали SESSID??? =)Ты помешан на безопасности, напиши свой обработчик сессий где проверяй тот ли ip ее юзал или нет =)))

  27. Alexander Zubakov Ответить

    #27, Алексей dLex Постников:
    "напиши свой обработчик сессий где проверяй тот ли ip ее узал или нет"

    Да уж давно додумался. И IP, и UA надо проверять, потому что перехват может осуществляться с "соседнего" компа в локалке. Хотя, надо признать, что подделка UA – дело 3 секунд. В таком случае, подходящим флагом, вкупе с IP, были бы все HTTP-заголовки, отправляемые браузером. Но это уже крайние меры, которые, опять же, ничего не гарантируют, а потому не целесообразны.

    #27, Алексей dLex Постников:
    "у тебя хоть раз крали SESSID???"

    У меня-то не крали. А вот как это осуществить, я прекрасно понимаю и допускать такую возможность в своих приложениях не хочу.

  28. Алексей Некторович Ответить

    ты перегибаешь =) ты пакеты на физическом уровне для этого генерить должен =) если есть привязка к ip =) а это просто космос =)))))

    А в том что http легко сниффить с соседнего компа в сети=) в этом не кто не сомневался что бы дернуть значение PHPSESSID =)))

  29. Alexander Zubakov Ответить

    Генерирование IP-пакетов ни при чем (кстати, это не так сложно, как звучит). Если у меня дом, где инет раздается по локальной сетке через один единственный шлюз, то, соответственно, и IP у всех пользователей в этой локальной сети будет одинаковый. То же касается интернет-залов и прочего.

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

    Добавить в РНР-программу лишние пару строк для проверки IP и UA не сложно, зато безопасность повышается.

  30. Плиско Вячеслав Ответить

    поддерживаю Alexander, у меня точно такая же сетка, причём хацкеров хватает, воруют всё что плохо лежит, чисто ради прикола

  31. Алексей Некторович Ответить

    я тебе и говорил про обработчик сессии, что его нужно менять на свой=) но с подменой IP (генерировать TCP/IP пакеты этокосмические технологии и это охирено сложно ПОТОМУ ЧТО Я ЭТО ДЕЛАЛ И ЗНАЮ ) это шизофрения
    мне тогда проще DNS атаку сделать =)

  32. Alexander Zubakov Ответить

    #32, Алексей dLex Постников:
    "генерировать TCP/IP пакеты этокосмические технологии и это охирено сложно ПОТОМУ ЧТО Я ЭТО ДЕЛАЛ И ЗНАЮ"

    Ну блондинка не разберется, конечно. Но вообще, преодолимо. Главное – соотношение затраты/результат.

    #32, Алексей dLex Постников:
    "я тебе и говорил про обработчик сессии, что его нужно менять на свой"

    Ну не то, чтобы менять, просто вписать небольшую проверочку в файл и инклудить его ко всем скриптам. Для более сложных примеров, конечно, можно и целую обертку над стандартным механизмом сессий сделать, а то и вообще заменить его.

Ответить