1. PHP / Говнокод #27039

    +3

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    /**
     * formHostnameRule: правило, проверяющее имя хоста
     *
     * @package system
     * @subpackage forms
     * @version 0.1.1
     */
    class formHostnameRule extends formAbstractRule
    {
        private $validTlds = array(
        'ac', 'ad', 'ae', 'aero', 'af', 'ag', 'ai', 'al', 'am', 'an', 'ao',
        'aq', 'ar', 'arpa', 'as', 'at', 'au', 'aw', 'ax', 'az', 'ba', 'bb',
        'bd', 'be', 'bf', 'bg', 'bh', 'bi', 'biz', 'bj', 'bm', 'bn', 'bo',
        'br', 'bs', 'bt', 'bv', 'bw', 'by', 'bz', 'ca', 'cat', 'cc', 'cd',
        'cf', 'cg', 'ch', 'ci', 'ck', 'cl', 'cm', 'cn', 'co', 'com', 'coop',
        'cr', 'cu', 'cv', 'cx', 'cy', 'cz', 'de', 'dj', 'dk', 'dm', 'do',
        'dz', 'ec', 'edu', 'ee', 'eg', 'er', 'es', 'et', 'eu', 'fi', 'fj',
        'fk', 'fm', 'fo', 'fr', 'ga', 'gb', 'gd', 'ge', 'gf', 'gg', 'gh',
        'gi', 'gl', 'gm', 'gn', 'gov', 'gp', 'gq', 'gr', 'gs', 'gt', 'gu',
        'gw', 'gy', 'hk', 'hm', 'hn', 'hr', 'ht', 'hu', 'id', 'ie', 'il',
        'im', 'in', 'info', 'int', 'io', 'iq', 'ir', 'is', 'it', 'je', 'jm',
        'jo', 'jobs', 'jp', 'ke', 'kg', 'kh', 'ki', 'km', 'kn', 'kr', 'kw',
        'ky', 'kz', 'la', 'lb', 'lc', 'li', 'lk', 'lr', 'ls', 'lt', 'lu',
        'lv', 'ly', 'ma', 'mc', 'md', 'me', 'mg', 'mh', 'mil', 'mk', 'ml', 'mm',
        'mn', 'mo', 'mobi', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv',
        'mw', 'mx', 'my', 'mz', 'na', 'name', 'nc', 'ne', 'net', 'nf', 'ng',
        'ni', 'nl', 'no', 'np', 'nr', 'nu', 'nz', 'om', 'org', 'pa', 'pe',
        'pf', 'pg', 'ph', 'pk', 'pl', 'pm', 'pn', 'pr', 'pro', 'ps', 'pt',
        'pw', 'py', 'qa', 're', 'ro', 'ru', 'rw', 'sa', 'sb', 'sc', 'sd',
        'se', 'sg', 'sh', 'si', 'sj', 'sk', 'sl', 'sm', 'sn', 'so', 'sr',
        'st', 'su', 'sv', 'sy', 'sz', 'tc', 'td', 'tf', 'tg', 'th', 'tj',
        'tk', 'tl', 'tm', 'tn', 'to', 'tp', 'tr', 'travel', 'tt', 'tv', 'tw',
        'tz', 'ua', 'ug', 'uk', 'um', 'us', 'uy', 'uz', 'va', 'vc', 've',
        'vg', 'vi', 'vn', 'vu', 'wf', 'ws', 'ye', 'yt', 'yu', 'za', 'zm',
        'zw'
        );

    https://github.com/wiistriker/govnokod_legacy/blob/master/mzz/system/forms/validators/formHostnameRule.php

    Кажется, я эту хуйню уже выкладывал, но да ладно, похуй: это говнище достойно даже повторной публикации здесь. Проебал из-за какой-то древней тупой пхп-макаки деньги за домен!

    Запостил: gost, 18 Октября 2020

    Комментарии (74) RSS

    • Тупые макаки.
      Ответить
    • Нет, не похуй.
      http://govnokod.ru/25607
      Ответить
      • Да-да, и именно в это же время были зареганы номерные петухи.
        Ответить
    • Именно поэтому я за питон:

      https://pypi.org/project/tld/
      Ответить
      • Говнище [в коньтексте валидации]. Всё равно это нужно руками обновлять (ну или в «systemd-timersd» задачу делатd).

        Единственный правильный способ валидировать домен — рагуляркой «.+». Единственный гарантированный — попробовать его отрезольвить (только это тоже сложно:надо ещё уметь отличать отсутствие A-записи от NXDOMAIN, например).
        Это как с «e-mail»: там правильный способ — это рагулярка «[email protected]+», а гарантированный — послать на заданный адрес письмо с подтверждением.
        Ответить
        • в имейле может быть несколько знаков @

          есть https://tools.ietf.org/html/rfc3696 в котором написано каким домен не может быть, все остальное приемлемо считать валидным доменом
          Ответить
        • Так смысл в том, что эта штучка в питоне работает с Public Suffix List, в который все нужные домены за тебя добавит мозилла:

          «Public Suffix List — проект Mozilla Foundation по созданию каталога публичных суффиксов доменов, используемых в сети Интернет. Ранее публичные суффиксы называли эффективными доменами верхнего уровня (effective top-level domain, effective TLD, eTLD). Список был создан в 2007 году Jo Hermans как дополнение к списку TLD от IANA. В настоящее время поддержкой каталога занимается Mozilla Foundation для целей повышения безопасности браузера Firefox. Сам список доступен под открытой лицензией Mozilla Public License и используется браузерами Chrome и Opera»

          И, в отличие от пхп-макаки, мозилла будет этот лист исправно обновлять. Или тебе не нравится сам подход, что нужно этот лист переодически обновлять и у себя?

          Так там это удобно сделано, можно сразу из питухона позвать update_tld_names(). Так что это решение более точное, чем регулярка.
          Ответить
          • > нужно этот лист переодически обновлять и у себя

            Именно так.

            > update_tld_names

            А где он их хранит?
            Ответить
            • > > нужно этот лист переодически обновлять и у себя

              > Именно так.

              Нужен https://api.mysql-real-public-suffix-list.xyz
              Ответить
              • А зачем вообще проверять названия доменов?

                Я понимаю зачем проверять доступность какого-то протокола на этом домене. Или работоспособность ссылки. Или вхождение домена в некий вайтлист. А название домена то нахуя?
                Ответить
                • хотя бы для того, чтобы улучшить эвристики нахождения доменов в тексте
                  Ответить
                  • > нахождения доменов в тексте

                    Бигдатобляди должны страдать.
                    Ответить
                    • ты наверное хотел сказать «ненавижу, блядь, нлп»
                      Ответить
                • а вообще там пишут два валидных юзкейса:

                  - как определять, какие куки кому могут принадлежать (с классическим .co.uk это не так очевидно)
                  - как определить/вычислить поддомен (если, например, клиент со своего адреса сделал пару CNAME на твой SaaS, а тебе нужно админку для этого лопуха держать на поддомене)
                  Ответить
              • https://publicsuffix.zone/

                накаркал, блядь
                Ответить
            • Я даже код нашел в документации:

              def update_tld_names(fail_silently=False):
                  """
                  Updates the local copy of TLDs file.
              
                  :param bool fail_silently: If set to True, no exceptions is raised on failure but boolean False returned.
                  :return bool: True on success, False on failure.
                  """
                  TLD_NAMES_SOURCE_URL = get_setting('NAMES_SOURCE_URL')
                  TLD_NAMES_LOCAL_PATH = get_setting('NAMES_LOCAL_PATH')
                  try:
                      remote_file = urllib2.urlopen(TLD_NAMES_SOURCE_URL)
                      local_file = open(PROJECT_DIR(TLD_NAMES_LOCAL_PATH), 'w')
                      local_file.write(remote_file.read())
                      local_file.close()
                      remote_file.close()
                  except Exception, e:
                      if fail_silently:
                          return False
                      raise TldIOError(e)
              
                  return True


              Видимо, хранит в каком-то файлике локальном, а обновляет с сайта. Всё гениальное просто )))

              > хранить лист

              А чем это лучше чем резолвить на каждый чих?
              Ответить
              • Заебись. Т.е. у меня ещё и каталог с исходниками должен быть доступен для записи? Или там как-то можно указать другой путь?

                А, NAMES_LOCAL_PATH.
                Ответить
          • Как я понял, у Страйкера список доменов для отсечения невалидных почтовых ящиков.

            «Public Suffix List» предназначен для другого. Он для политики передачи кук в браузере.

            Например, если я поставлю куку для «ru», то она будет валидна и для «mail.ru», и для «yandex.ru». Чтобы этого не произошло, в «Public Suffix List» добавляют домен «ru». Это означает: «Не применять куки для «ru» к поддоменам». А вот к «disk.yandex.ru» браузер может применить куку от «yandex.ru», потому что «yandex.ru» нет в «Public Suffix List».

            Т. е. в «Public Suffix List» могут отсутствовать валидные домены первого уровня (потому что их админ разрешил передавать куки поддоменам), но могут присутствовать домены второго и более высоких уровней. Для проверки почтовых ящиков на валидность такой список бесполезен.

            Для проверки корневых доменов в почтовых ящиках на валидность нужен другой список, а именно этот:
            ftp://ftp.internic.net/domain/root.zone
            Ответить
            • То есть питухоны не разобрались и обосрались. Какой багор )))
              Ответить
            • > политики передачи кук

              Блядь, какое же всё-таки дерьмо этот веб...

              Сука, ну почему нельзя было просто явно указывать для каких доменов эта кука? И явно указывать, от каких доменов я согласен принимать куки. А не делать какие-то ебанутые эвристики.

              З.Ы. Видимо из-за этого гитхабу и пришлось унести все недоверенные юзерские данные на левый домен вообще в другой зоне.
              Ответить
              • Эта фигня вроде должна гуглиться по запросу «cookie monster», но мне почему-то в результатах попадается «Улица Сезам».
                Ответить
                • Т.е. я себе такую схему представляю:

                  1) foo.com публикует куку для bar.com.
                  2) При запросе на bar.com браузер отдаёт ему эту куку вместе с именем домена, который её ставил.
                  3) bar.com видит, что кука от foo.com и принимает её.

                  Никакой магии, никаких списков TLD, никаких проблем с кросс-доменностью...

                  З.Ы. Хотя криворукие макаки конечно же обосрутся и опубликуют куку на все *.com, а потом ещё и примут куки от всех *.com
                  Ответить
                  • именно)

                    Жопа в том, что технически нет границы между "мой домен и поддоменами" и "чужой домен"

                    От этого страдают многие, и hsts preload, и вот это говно с куками тоже.
                    Ответить
                    • > hsts preload
                      Кстати да, чтобы сделать «hsts preload» на домен example.com, сервер обязательно должен отвечать «includeSubDomains» с соответствующими последствиями. «Narod.ru» негодует.
                      Ответить
                      • там еще жопка в том, что я не могу попросить прелоад для поддомена: только для домена

                        а чтобы отличать поддомен и домен им пришлось захардкотить корневые домены..

                        у меня на работе в одном проекте был такой отсос: у меня был домен myproject.mycompany.com, и я не мог его preload, потому что можно только целиком mycompany.com, а им управляют другие люди, и не хотят прелоад, потому что есть всякие питухи в поддоменах, котрые не асилили https
                        Ответить
                  • Ну вот из-за тех мудаков, которые публиковали куки для *.com, и пришлось лепить «Public Suffix List».
                    Ответить
                    • опубликовал тебе кук на .com на мегабайт, и сломал нахуй весь браузинг

                      на самом деле там лимит есть на размер вроде
                      Ответить
                      • «Opera» на «Presto» ещё поддерживала «Cookie2»:
                        https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cookie2
                        https://tools.ietf.org/html/rfc2965

                        Но больше никто этот проект не поддержал, и его отменили.

                        А потом вместо исправления недостатков протокола обмена куками налепили кучу новых: localStorage, globalStorage, sessionStorage, indexedDB, Web SQL Database...
                        Ответить
                  • > З.Ы. Хотя криворукие макаки конечно же обосрутся и опубликуют куку на все *.com, а потом ещё и примут куки от всех *.com

                    Это ты еще не смотрел как в браузере новую куку объявить!
                    Ответить
            • https://github.com/arubacao/tld-checker

              А вот и биндинг к «РНР». Надеюсь, это не то же самое, что в говнокоде, потому что, вроде бы, эта штука выглядит очень даже солидно.
              Ответить
              • /**
                 * Data Source: Root Zone Database
                 * The Root Zone Database represents the delegation details of top-level domains,
                 * including gTLDs such as .com, and country-code TLDs such as .uk.
                 *
                 * @see https://data.iana.org/TLD/tlds-alpha-by-domain.txt
                 *
                 * # Version 2020101700, Last Updated Sat Oct 17 07:07:01 2020 UTC
                 * @version 2020101700
                 */
                class RootZoneDatabase
                {
                    const VERSION = 2020101700;
                
                    const TLDS = [
                        'AAA',
                        'AARP',
                        'ABARTH',
                        'ABB',
                        'ABBOTT',
                        'ABBVIE',
                        'ABC',
                        'ABLE',
                        'ABOGADO',
                        'ABUDHABI',
                        'AC',
                        'ACADEMY',
                        'ACCENTURE',
                        'ACCOUNTANT',
                        'ACCOUNTANTS',
                        'ACO',
                        'ACTOR',
                        'AD',
                        'ADAC',
                        'ADS',
                        'ADULT',

                Блядь, ну почему пхпшники — такое говно?
                Ответить
                • Это не говно, а database-as-a-code.
                  Ответить
                • ты посмотри какой, всего семь утра, а он уже работу работает
                  Ответить
                • Кстати, всего каких-то лет семь назад ICANN наотрез отказывался принимать новые TLD. Было всего два шестизначных TLD (travel и museum, но ими почти никто не пользовался) и несколько четырёхзначных (из них был популярен только info, а остальными типа aero, coop, jobs, name почти никто не пользовался):
                  http://web.archive.org/web/20120111154409/data.iana.org/TLD/tlds-alpha-by-domain.txt

                  А потом бабахнуло, и список TLD стал расти, как снежный ком.
                  Ответить
                  • >It is extremely unlikely that
                    any other TLDs will be created.

                    https://tools.ietf.org/rfc/rfc1591.txt


                    но жадность победила
                    Ответить
                    • Я вообще не понимаю всей этой хуйни. Зачем вообще было городить всё это разделение? Почему не плоское адресное пространство, где можно использовать любой TLD с фиксированной ценой? А для всяких там формальных представительств просто делать запись в каком-нибудь дополнительном реестре поверх DNS, выдавать EV, тупо заканчивать домен каким-нибудь суффиксом $ или просто выделить для этого какой-нибудь один TLD? И из-за этого приходится ебаться со всякими списками, предоставлять какие-то документы для покупки домена в одной зоне и не делать этого в другой, плакать о невозможности купить nesvaren.ie без необходимого гражданства, для этой зоны HTTPS обязателен, а для этой нет, ну нахера вообще было весь этот зоопарк городить.
                      Ответить
                      • >плоское
                        hosts.txt же, как в 1982-м году.

                        В твоей схеме не очень понятно, кто будет поддерживать всё это многообразие. Корневые сервера не резиновые, чтобы каждый питух мог в них TLD регистрировать.
                        Ответить
                        • ну а как текущие сервера какого-то tld поддерживают миллионы записей, а корневые не могут? шардирование есть, в конце концов.
                          Ответить
                          • ну так миллионы записей есть в каждом tld, а так они все ломанутся в корневые.

                            У них и так высокая нагрузка, и пришлось делать эникаст, а так они вообще лягут.

                            Да и не понятно как то реализовать с точки зрения бизнеса: придется делать каких-то регистраторов отдельных, ведь не будут же авторы кулинарных блогов покупать домены прямо у корня
                            Ответить
                            • Ну ты еще скажи что гугл ляжет, если я его пинговать начну, это всё же очень примитивно масштабируется. даже если представить что есть какая-то затычка на уровне сети с одним адресом, то тупо сделать какой-нибудь 8.8. + hash(domainName) % 65536, а кто ломится не на тот сервер, тому отлуп ответом с ошибкой.
                              Ответить
                              • гугл тратит несметное число бабла, гугл очень богат

                                а все эти IANA изначально некоммерческие. У них нет столько денег.

                                А если им становиться коммерческими, то сразу встает вопрос: а какого хуя бабло будет идти именно им?

                                > есть какая-то затычка на уровне сети с одним адресом,
                                это как раз эникастом они решили
                                Ответить
                                • > У них нет столько денег.

                                  Ты в курсе что только подать заявку на новый TLD стоит 185k баксов? И что они с каждого домена гребут что-то порядка двадцти центов?
                                  Ответить
                                  • > И что они с каждого домена гребут что-то порядка двадцти центов?

                                    схубяы?

                                    >185k
                                    ну вот цена за поддержку записи у них. И это делегирование, без RR.

                                    Кто за такие деньги купит домен?
                                    Ответить
                        • > В твоей схеме не очень понятно, кто будет поддерживать всё это многообразие.

                          а пусть ICANN ебется, я ж не говорю "раздайте народу бесплатно", пусть покупают себе домены, как и сейчас
                          Ответить
                          • Ну тут ещё и политические проблемы. Не всем странам хочется, чтобы кто-то за них ебался с их доменами.
                            Ответить
                            • Ой, в этом домене у меня куда больше претензий, нежели к системе TLD.

                              Сейчас понятно, что так уже не сделать, но если бы в пору "нахуй ваш интернет нам не нужон" всё так организовали - деваться было бы некуда, и роскомнадзор наконец-то бы соснул как следует.
                              Ответить
                          • Ты предлагаешь децентрализацию заменить централизацией. Это не оч хорошо.
                            Ответить
                            • Я предлагаю хуевое решение заменить централизацией. Но да, с точки зрения управления надо как-то это дело разбивать.
                              Ответить
                              • не вижу ничего хуевого в децентрализации.

                                Чем больше сервисов предлагают домены, тем выше конкуренция и ниже цены
                                Ответить
                                • мы не про цены, мы про ебанутость всего цирка с TLD без упоминания ценников
                                  Ответить
        • >рагуляркой «.+».
          На самом деле должна быть как минимум одна точка у публичного домена, и не должно быть пробелов. Но если ты делаешь ресурс для интранета, то точки может и не быть.

          >рагулярка «[email protected]+»,
          Кажется, перед собачкой может ничего и не быть: это locally interpreted name вроде, но надо курнуть рфц.
          Ответить
          • Ответить
          • Точка должна быть обязательно? Я не могу прикрутить к корневому домену MX-запись?
            Ответить
            • блядь
              ты прав
              https://serverfault.com/questions/154991/why-do-some-tld-have-an-mx-record-on-the-zone-root-e-g-ai
              Ответить
            • сука

              Емейл сервер Всея Украины
              ~$ host ua
              ua mail is handled by 10 mr.kolo.net
              Ответить
              • Значит, можно завести ящик [email protected], если админ kolo.net его даст?
                Ответить
                • выходит, что так

                  правда, их почтовик писем не принимает
                  554 mr1.nd.kolo.net ESMTP not accepting messages


                  554 Transaction failed (Or, in the case of a connection-opening
                  response, "No SMTP service here")
                  Ответить
                  • И самое обидное было бы, если бы у них почтовик принимал письма, что зарегистрироваться с таким ящиком на многих форумах не получилось бы, потому что некоторые движки проверяют валидность адреса регуляркой, в которой почему-то требуется точка в домене.
                    Ответить
    • нужен отдел из пяти программистов, чтобы каждую неделю добвляли туда новые домены, потому что многих доменов там конечно нет
      Ответить
    • поднимите руку те, кто думал, что "re:" в ответе в емелйе означает "reply"
      Ответить
      • А разве нет?
        Ответить
        • "Re: " (an abbreviation of the Latin "in re", meaning "in the
          matter of")
          rfc5322
          Ответить
          • ага,щас я позволю какому-то rfc указывать мне как мне расшифровывать
            Ответить
    • https://dnslytics.com/ipv6/2604:8d00:0:1::4
      >russian-caravan.cloud9.net


      оказываеца, russian caravan это чай
      Ответить
    • Фреймверки не нужны.
      Ответить

    Добавить комментарий