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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                                  Питон тоже можно компилировать, да.

                                  https://www.jython.org/jython-old-sites/archive/21/docs/jythonc.html

                                  А «груви» я не знаю, но он очень прикольно выглядит, я тоже за него как за скриптушню для джавы.
                                  Ответить
                                  • >jythonc transforms Python source code into Java source code then invokes a Java compiler to turn it into .class

                                    офигеть:) А груви можно налету
                                    Ответить
                                    • Ещё есть «транслятор» питона с С++, чтобы потом компилить С++, тоже та ещё питушня.
                                      Ответить
          • Как я понял, у Страйкера список доменов для отсечения невалидных почтовых ящиков.

            «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
                  Ответить
                  • показать все, что скрытоvanished
                    Ответить
                  • Ну вот из-за тех мудаков, которые публиковали куки для *.com, и пришлось лепить «Public Suffix List».
                    Ответить
                    • показать все, что скрытоvanished
                      Ответить
                      • «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 стал расти, как снежный ком.
                  Ответить
                  • показать все, что скрытоvanished
                    Ответить
                    • Я вообще не понимаю всей этой хуйни. Зачем вообще было городить всё это разделение? Почему не плоское адресное пространство, где можно использовать любой TLD с фиксированной ценой? А для всяких там формальных представительств просто делать запись в каком-нибудь дополнительном реестре поверх DNS, выдавать EV, тупо заканчивать домен каким-нибудь суффиксом $ или просто выделить для этого какой-нибудь один TLD? И из-за этого приходится ебаться со всякими списками, предоставлять какие-то документы для покупки домена в одной зоне и не делать этого в другой, плакать о невозможности купить nesvaren.ie без необходимого гражданства, для этой зоны HTTPS обязателен, а для этой нет, ну нахера вообще было весь этот зоопарк городить.
                      Ответить
                      • показать все, что скрытоvanished
                        Ответить
                        • ну а как текущие сервера какого-то tld поддерживают миллионы записей, а корневые не могут? шардирование есть, в конце концов.
                          Ответить
                        • > В твоей схеме не очень понятно, кто будет поддерживать всё это многообразие.

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

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

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