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

    +1

    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
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    <?php
    /**
     * $URL: svn://svn.subversion.ru/usr/local/svn/mzz/trunk/system/forms/validators/formHostnameRule.php $
     *
     * MZZ Content Management System (c) 2005-2007
     * Website : http://www.mzz.ru
     *
     * This program is free software and released under
     * the GNU/GPL License (See /docs/GPL.txt).
     *
     * @link http://www.mzz.ru
     * @version $Id: formHostnameRule.php 3864 2009-10-21 04:50:04Z zerkms $
     */
    /**
     * 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'
        );
        protected function _validate($value)
        {
            if (preg_match('#^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$#', $value)) {
                return true;
            }
            $domainParts = explode('.', $value);
            if (sizeof($domainParts) < 2) {
                return false;
            }
            if (strlen($value) > 254 || strlen($value) < 4) {
                return false;
            }
            $tld = array_pop($domainParts);
            if (!in_array(strtolower($tld), $this->validTlds)) {
                return false;
            }
            $validChars = 'a-z0-9\-';
            foreach ($domainParts as $part) {
                if (strpos($part, '-') === 0 || (strlen($part) > 3 && strpos($part, '--', 2) === 2) || substr($part, -1) === '-') {
                    return false;
                }
                if (!preg_match('#^[' . $validChars . ']{1,63}$#i', $part)) {
                    return false;
                }
            }
            return true;
        }
    }
    ?>

    Домены валидировали-валидировали, да недовалидировали.

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

    Запостил: gost, 17 Мая 2019

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

    • Багор
      Ответить
    • Помню те древние времена, когда из длинных доменов первого уровня были только arpa, info, aero, name, mobi, jobs, museum, travel. Причём популярным из них был только info, а на остальных длинных и сайтов-то не было. Тогда «Windows XP» ещё считалась новомодной системой.
      Ответить
    • –— Мамо, чому я перевіряю е-мейли по фіксованому списку доменів?
      —– Тому що у пехапешніков не буває нормальних дітей.
      Ответить
      • В конце концов, это не очень хорошая идея.
        Ответить
    • список не полный. а в остальном всё ок.
      Ответить
      • Что ок? А как обновлять этот список? Вручную мониторить список доменов и редактировать файл formHostnameRule.php?
        Ответить
      • Тогда вам не нужно быть членом сообщества!
        Ответить
        • А Вам подучить русский язык.
          а говнокод годный, тем более, что уже первая проверка
          [code language="php"]preg_match('#^\d{1,3}\.\d{1,3}\.\d{1,3}\ .\d{1,3}$#', $value)[/code]
          для IPv4 не верна, а 2-4 можно заменить на filter_var(...).
          впрочем, зачем я это объясняю "члену сообщества"?
          Ответить
          • Какая вам разница, что у меня? Русский язык, серый капюшон, ветерок или сиденье унитаза?
            Ответить
    • Блин, мне сперва показалось, что это что-то на мотив:
      http://govnokod.ru/25224
      Ответить
      • Rooster, что ты делаешь с девизом: Блондинка, моя любовь, моя любовь, я люблю тебя... может показалось!?
        Ответить
    • > if (preg_match('#^\d{1,3}\.\d{1,3}\.\d{1,3} \.\d{1,3}$#', $value))
      Оно разве не должно быть:
      ^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$
      ?

      ЗЫ. когда-то пробовал регать по IP, ни один из вариантов не прошёл.
      Ответить
      • Оказывается это из RFC822, в современных версиях я IP-адресов не нашел:
        https://tools.ietf.org/html/rfc5322#section-3.4
        Ответить
        • В RFC5322 тоже есть что-то в квадратных скобках:
          addr-spec       =   local-part "@" domain
          
             local-part      =   dot-atom / quoted-string / obs-local-part
          
             domain          =   dot-atom / domain-literal / obs-domain
          
             domain-literal  =   [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS]
          
             dtext           =   %d33-90 /          ; Printable US-ASCII
                                 %d94-126 /         ;  characters not including
                                 obs-dtext          ;  "[", "]", or "\"
          
          The domain portion identifies the point to which the mail is
             delivered.  In the dot-atom form, this is interpreted as an Internet
             domain name (either a host name or a mail exchanger name) as
             described in [RFC1034], [RFC1035], and [RFC1123].  In the domain-
             literal form, the domain is interpreted as the literal Internet
             address of the particular host.  In both cases, how addressing is
             used and how messages are transported to a particular host is covered
             in separate documents, such as [RFC5321].  These mechanisms are
             outside of the scope of this document.


          Literal Internet address –— это, вероятно, и есть айпишник.
          Ответить
          • Всё равно большинство почтовых сервисов их не признаёт, можно считать что их нету.
            Ответить
            • Скажу больше: я пока не знаю, какие сервисы их признают. Есть хоть один на примете, чтобы потестировать?
              Ответить
      • Ага, ещё одна потёкшая обсракция — этот валидатор валидирует домен (абстрактный, не конкретно и-мейловский), а валидатор и-мейла делегирует проверку домена из адреса этому модулю и закономерно проёбывается на вот таких мелочах.
        Ответить
        • Ага, ezo является поисковой системой по умолчанию - это живая поисковая система (эстетически, а не конкретно), делегирование делегата на доменное имя и адрес сайта и общественности.
          Ответить
    • Интересный факт: по данным https://ru.tld-list.com/, в настоящее время существует 2951 домен верхнего уровня.
      Ответить
      • Здраствуй, гугл-транслейт.

        Валидатор может парсить домены отсюда:
        https://ru.tld-list.com/tlds-from-a-z
        Ответить
        • О, и правда гугл-транслейт.

          Кстати, если без зелёного, то для максимально строгой валидации домена действительно можно регулярно обновлять (скриптами, конечно) список TLD из https://tld-list.com/df/tld-list-basic.txt (правда, их там почему-то всего около полутора тысяч). Но на кой хрен такое может пригодиться — хз.
          Ответить
          • Вообще «официальный» способ — брать их с internic.net. Например, отсюда:
            ftp://ftp.internic.net/domain/root.zone
            Ответить
          • А ещё есть проект «Public Suffix», но он для другого, а именно для борьбы с «печеньковым монстром»:
            https://publicsuffix.org/list/public_suffix_list.dat

            Естественно, в нём домены могут обновляться медленнее, чем в «InterNIC».
            Ответить
    • Домен - это подарочная помойка и много людей.
      Ответить
    • а не проще захардкодить все возможные емейлы?
      Ответить

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