Блог пользователя dalex

Автор dalex, 10 лет назад, По-русски

Так как администрация сайта не хочет фиксить баг с двумя разными кодефорсесами (1 2), прошу всех пользователей вставлять относительные ссылки.

Это делается так:

При переходе по такой ссылке вы не будете разлогинены. Спасибо.

  • Проголосовать: нравится
  • +73
  • Проголосовать: не нравится

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Баг?

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Фича.. при переходе с .ru на .com меняется домен, а значит, сессии не сохраняются

    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится +13 Проголосовать: не нравится

      А вот на google.com если я авторизован, то на google.ru тоже

      • »
        »
        »
        »
        10 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

        В принципе это делается, например, несколькими редиректами

»
10 лет назад, # |
  Проголосовать: нравится -10 Проголосовать: не нравится

А как предлагается фиксить этот "баг"? Это же разные домены, там разные куки, всё логично. Если вы, например, залогинитесь на yandex.ru, то не будете залогинены на yandex.com. Возможным решением было бы en.codeforces.com и ru.codeforces.com, но это сломает существующие ссылки.

  • »
    »
    10 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

    А вы попробуйте yandex.kz и yandex.ua

    И кстати, ваш аргумент не работает с www.codeforces.ru и codeforces.ru, там тоже отдельная авторизация Кажется, www. уже выпилили

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится +2 Проголосовать: не нравится

    А как предлагается фиксить этот "баг"?

    Так куки это не единственное место где можно хранить идентификатор сессии. :)

    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Какое ещё место предлагаете? Query parameters в URLе? Это очень неправильно. HTML5 Local Storage? Не у всех новые браузеры, и та же проблема с доменами.

      Есть конечно вариант при авторизации поставить куки на оба домена (с помощью какого-нибудь кривого хака), но кривые хаки имеют свойства порождать множество неожиданных проблем.

      • »
        »
        »
        »
        10 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Query-параметры в урле используют, да... Ещё hidden-поля используют — но это всё годится только для переходов по ссылкам в теле отрендеренного нами же документа. Идею с Local Storage слышу впервые — браузеры-то у всех новые, но разве localstorage будет шариться между страницами разных доменов? :)

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

        • »
          »
          »
          »
          »
          10 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Query-параметры ни для чего не годятся, хотя бы из соображений безопасности.

          Про local storage не знаю, я же написал, что там тоже с доменами будут проблемы, я просто перечислил всё что теоретически можно было бы использовать.

          По вашей ссылке предлагают использовать OpenID, (т.е. очень грубо говоря (если я правильно всё помню), использовать аутентификацию на каком-то third-party домене, который подтвердит то, что пользователь залогинен, по запросу codeforces, после чего codeforces может поставить свою куку). Но OpenID тут и так поддерживается, кто хочет — уже им пользуется.

          И да, даже в случае OpenID, идентификатор сессии всё равно хранится в куке. Так что жду предложений, где ещё его можно хранить =)

          • »
            »
            »
            »
            »
            »
            10 лет назад, # ^ |
            Rev. 2   Проголосовать: нравится -8 Проголосовать: не нравится

            Да не, OpenID тут сам по себе мало чем поможет, я видимо ссылку не с той страницы скопировал.

            Мы если в страницу вставляем javascript с третьего сервера — например гугл аналитику или фейсбук логин — то этот javascript создаёт куки привязанные к какому домену?

            UPD. Опять вру. А меж тем куки чужие каким-то образом появляются. Даже на текущей странице codeforces.

            • »
              »
              »
              »
              »
              »
              »
              10 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится

              В случае со всякими гугл-аналитиками — да, куки для разных доменов, и они не могут понять, что один и тот же пользователь заходил на 2 разных сайта (да и не должны — это было бы privacy violation).

              А вот фейсбук-кнопочки гораздо злее — там iframe'ы, и они живут в фейсбуковском домене.

              А что за фейсбук логин? Вы имеете в виду OAuth? Там всё гораздо хитрее.

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится +13 Проголосовать: не нравится

    Есть такой аргумент: это как-то пофиксили Яндекс и Гугл. Значит, это возможно. Значит, это должно быть сделано. Меня, как пользователя, не очень волнует "красивость" решения, мне надо, чтобы у меня работало и, по возможности, относительно безопасно.

    Например, можно завести один конкретный домен для логина. Скажем, auth.codeforces.com и всё проводить через него при помощи редиректов.

    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится -13 Проголосовать: не нравится

      Есть такой аргумент: это как-то пофиксили Яндекс и Гугл

      Отличный аргумент. Я ж прям в комменте на который вы отвечаете написал: залогиньтесь на yandex.ru и зайдите на yandex.com. По такой "логике", наверное есть причины, почему яндекс этого не делает, т.е. не всё так однозначно?

      Далее, я ничего не говорил про "красивость" (почему такое странное слово? в русском языке же есть существительное "красота") решения, более того, модель безопасности браузеров настолько кривая и похаканная, что ожидать чего-либо красивого там не приходится. Однако пытаться нахакать cross-domain авторизацию редиректами, не имея https, — почти наверняка приведёт к багам в безопасности.

      Теперь по сути. Посмотрел, что делает yandex.ua. Оно редиректит на pass.yandex.ru, браузер отдаёт туда куку, после чего pass.yandex.ru редиректит на pass.yandex.ua с query-параметром, по всей видимости содержащим одноразовый токен; получив этот токен, yandex.ua ставит свою куку. Если я правильно понял этот процесс, то с https он видимо безопасен, а вот без https враг (например, слушающий трафик в халявном вайфае) может использовать одноразовый токен раньше вас. Впрочем, можно сделать server-side "защиту" — если токен попытались использовать второй раз за корокий промежуток времени, считать сессию невалидной.

      В любом случае, эта схема выглядит достаточно secure'но на фоне того, что codeforces не использует https. Так что ИМХО, можно и сделать. И надо начинать именно с конкретных технических предложений, а не постов "я пользователь, у вас баг, сделайте чтобы было хорошо!11". Здесь всё же сообщество по программированию, а не по вышиванию крестиком...

      • »
        »
        »
        »
        10 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        А разве с тем же успехом нельзя в http похакать заголовки, в которых данные cookie, в которых session_id?

        • »
          »
          »
          »
          »
          10 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Да, можно, но для этого обязательно слушать весь трафик. В случае query-параметров всё хуже, например, их по умолчанию всякие прокси логгируют, да и вообще, RFC говорит, что девелоперы не должны полагаться на секретность URLа.

          • »
            »
            »
            »
            »
            »
            10 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится

            А почему бы не отправлять post-запрос с параметром временного токена?

  • »
    »
    10 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

    А в чём проблема? Реализуется по принципу OpenID.

    UPD. Да, ну вобщем-то, яндекс (как и все остальные) и реализует это по такому принципу, как Вы и описали выше

    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Хм, почитал, что делает OpenID, очень похоже на схему в yandex.ua. Да, так можно сделать, но возникает 2 вопроса:

      1) Codeforces и так поддерживает OpenID, а чём проблема им пользоваться?

      2) Зачем писать посты "всё плохо, сделайте так чтобы было хорошо", когда можно вносить конкретные технические предложения? Не все же знают как OpenID работает.

      • »
        »
        »
        »
        10 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится +23 Проголосовать: не нравится

        2) А если, например, мозгов не хватает, чтобы внести конкретное предложение, но хватает, чтобы понять, что что-то не так и так быть не должно?

        • »
          »
          »
          »
          »
          10 лет назад, # ^ |
            Проголосовать: нравится -30 Проголосовать: не нравится

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

      • »
        »
        »
        »
        10 лет назад, # ^ |
          Проголосовать: нравится +5 Проголосовать: не нравится

        Сторонний OpenID тут имеет другое значение — он мне просто даёт возможность не регаться ещё раз на кф, а логиниться просто по существующей где-то регистрации. И он решает проблему только тем, кто через него логинится.

        А если я захожу не по стороннему OpenID, а, например, по логин-паролю, то возникает означенная проблема. И для этого как раз и реализуется собственный OpenID. Вообще его не сложно и не долго реализовать.

        • »
          »
          »
          »
          »
          10 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Ну можно например выбрать одного фиксированного OpenID-провайдера и автоматически пробовать авторизоваться через него для незалогиненных пользователей. Ну или да, сделать своего OpenID-провайдера. Единственная проблема — для незалогиненных пользователей будут дополнительные тормоза из-за редиректов; да, можно сделать workaround'ы и для этого, но ИМХО для незалогиненных пользователей это не круто.

          Вообще говоря, у codeforces всего 2 заранее известных домена, поэтому, казалось бы, можно сделать всё в другую сторону: при логине ставится одна кука + при помощи редиректа с query-параметром ставится вторая. Кажется, такой вариант самый добрый, если я правильно всё понимаю.

          • »
            »
            »
            »
            »
            »
            10 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится

            А как яндекс решает эту проблему? Они же тоже должны всегда отправлять запрос на pass.ya

            Редирект по цепочке доменов забавное решение :)

»
10 лет назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

Проверка поможет ли, если вставлять через dropdown в редакторе:

tourist
1
1A - Театральная площадь
Codeforces Beta Round 1
результаты

UPD: Да, работает. Отсюда вывод: не вставляйте ссылки руками, CodeForces сам умный.

»
10 лет назад, # |
  Проголосовать: нравится -16 Проголосовать: не нравится

Мне кажется, эта проблема скорее относится к англоязычным пользователям сайта, потому как именно они используют codeforces.com. Так что лучше было бы постить это на английском

»
10 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится

Естественно, что, пока это не будет исправлено в системе, 99% пользователей об этом даже не задумается.

Для себя я решил проблему простым перенаправлением с .com на .ru. Можно, например, использовать это расширение: https://addons.mozilla.org/ru/firefox/addon/redirector

»
10 лет назад, # |
  Проголосовать: нравится +9 Проголосовать: не нравится

Извиняюсь за некропост, просто хотел заметить, что для Codeforces не проблема делать это автоматически при отправке текста — детектить имя домена в ссылках и превращать их в относительные.