"PHP" / Говнокод #27039 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 gost, (Updated )

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

    • Да-да, и именно в это же время были зареганы номерные петухи.
      Ответить
    • Говнище [в коньтексте валидации]. Всё равно это нужно руками обновлять (ну или в «systemd-timersd» задачу делатd).

      Единственный правильный способ валидировать домен — рагуляркой «.+». Единственный гарантированный — попробовать его отрезольвить (только это тоже сложно:надо ещё уметь отличать отсутствие A-записи от NXDOMAIN, например).
      Это как с «e-mail»: там правильный способ — это рагулярка «.+@.+», а гарантированный — послать на заданный адрес письмо с подтверждением.
      Ответить
      • Так смысл в том, что эта штучка в питоне работает с 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

          А где он их хранит?
          Ответить
            • А зачем вообще проверять названия доменов?

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

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

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

            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.
              Ответить
            • То есть если в «local_file.write(remote_file.read())» вылетит птичка-исклютичка, то открытые файлы он не закроет? Какое говно )))
              Ответить
              • Вполне возможно, что когда умрёт объект local_file, вызовется его деструктор и файл закроется, но (!) это действительно говно, т.к. вызов деструктора это недетерменированная питушня, и так делать не советуют.

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

                        > Последняя версия: 2.7.2 (21 марта 2020)

                        Он даже круче котлина и всяких других штук, если тоже работает с жвм и интегрируется с джавой.
                        Ответить
                        • Есть только один важный момент: питон 2.7 не нужен

                          > даже круче котлина и вся
                          чем круче? тем, что не имеет статической типизации и не компилируеься?
                          Ответить
                          • В данном случае компилируется в йажа код, а отсутствие статической типизации – это плюс, потому что со статической типизацией и так можно писать на джаве.

                            Такой красивый код получится, если намешать скриптушню и вербозную джаву, ммммммм делишес.
                            Ответить
                            • >В данном случае компилируется в йажа код
                              Что компилируется? Питон?

                              >а отсутствие статической типизации – это плюс,
                              Такой плюс, что гнидо аж mypy напили

                              >сли намешать скриптушню и вербозную джаву, ммммммм делишес.

                              Именно потому я за "Груви": там можно мешать компиляцию и инвокдайнемик

                              зы: еще раз напоминаю, что писать на py27 в 2020 существует -1 причина, или может чуть больше
                              Ответить
        • Как я понял, у Страйкера список доменов для отсечения невалидных почтовых ящиков.

          «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
          Ответить
          • То есть питухоны не разобрались и обосрались. Какой багор )))
            Ответить
            • Да уж... Вот это реально багор!

              ***

              Author

              Artur Barseghyan <artur.barseghyan@gmail.com>
              Ответить
          • > политики передачи кук

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

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

            З.Ы. Видимо из-за этого гитхабу и пришлось унести все недоверенные юзерские данные на левый домен вообще в другой зоне.
            Ответить
            • Эта фигня вроде должна гуглиться по запросу «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 на мегабайт, и сломал нахуй весь браузинг

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

                  Это ты еще не смотрел как в браузере новую куку объявить!
                  Ответить
            • /**
               * 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',

              Блядь, ну почему пхпшники — такое говно?
              Ответить
              • ты посмотри какой, всего семь утра, а он уже работу работает
                Ответить
              • Кстати, всего каких-то лет семь назад 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 стал расти, как снежный ком.
                Ответить
                  • Я вообще не понимаю всей этой хуйни. Зачем вообще было городить всё это разделение? Почему не плоское адресное пространство, где можно использовать любой 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 без упоминания ценников
                                Ответить
      • >рагуляркой «.+».
        На самом деле должна быть как минимум одна точка у публичного домена, и не должно быть пробелов. Но если ты делаешь ресурс для интранета, то точки может и не быть.

        >рагулярка «.+@.+»,
        Кажется, перед собачкой может ничего и не быть: это locally interpreted name вроде, но надо курнуть рфц.
        Ответить
        • Точка должна быть обязательно? Я не могу прикрутить к корневому домену MX-запись?
          Ответить
          • сука

            Емейл сервер Всея Украины
            ~$ host ua
            ua mail is handled by 10 mr.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 указывать мне как мне расшифровывать
          Ответить

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8