За последние 24 часа нас посетили 61666 программистов и 3046 роботов. Сейчас ищет 1291 программист ...

регулярные выражения для кириллицы и символов

Тема в разделе "PHP для новичков", создана пользователем ivnphp, 11 окт 2015.

  1. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    eldor покажи коллизию
     
  2. eldor

    eldor Активный пользователь

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    Вот
    Код (PHP):
    1. //Пароль, который вводит пользователь при регистрации.
    2. $pass = 'qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfqwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopas';
    3. $hash = password_hash($pass, PASSWORD_BCRYPT);
    4.  
    5. ...
    6.  
    7. //Пароль, который вводит пользователь при авторизации.
    8. $pass_2 = 'qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfqwertyuiopasdfghjklzxcvbnm';
    9. if (password_verify($pass_2, $hash))
    10. {echo 'Вход выполнен';}
    11. else
    12. {echo 'Вход НЕ выполнен';}
    И вот при таком раскладе вход будет выполнен. Перед написанием ответа еще раз протестировал.

    Код (PHP):
    1. $a1 = 'qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfqwertyuiopasdfghjklzxc';
    2. $a2 = 'qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfqwertyuiopasdfghjklzx';
    При пароле $a1 вход еще выполняется, а при пароле $а2 - уже нет.
     
  3. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    password_hash() и password_verify() никак не связаны с тем, что md5 и sha256 считаются ненадежными. Эти функции будут юзать тот же md5, если ничего окромя него в системе не предусмотрено. Их сделали из соображений того, что куча криворуких дятлов хранят пароли в открытом виде просто по той причине, у них мозгов не хватает осилить нормальное хеширование с нормальной солегенерацией. Либо криворукие дятлы хранят соли или хеши в куках либо еще что.

    В общем, процент криворуких дятлов, не могущих в безопасность растет. Процент юзания PHP в мире тоже не снижается. В сумме общий фон безопасности катится во мглу. Сайтов больше, уровень развития меньше. Криворукие дятлы учатся по видеоурокам других криворуких дятлов...

    Сели разрабы, покурили с горя, и решили сделать password_hash() и password_verify(), чтобы как-то выправлять ситуацию. Если криворукие дятлы не могут сами в механизмы хранения паролей, давайте замутим этот механизм на уровне языка.
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Это не коллизия, а результат ограничения.

    http://php.net/manual/ru/function.password-hash.html#refsect ... parameters
     
  5. eldor

    eldor Активный пользователь

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    Ну так следствием ограничения и является недопущение коллизии, на сколько я понял))
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Плохо понял. Там английским по-желтому написано:
    При юзании бикрипта, принимаемый в параметры пароль будет усечен до 72 символов, такие дела.

    То есть все, что свыше 72 символов, отбрасывается. Если два пароля на дистанции 72 символа совпадают, а дальше нет, значит они одинаковые. НО, даже в таком случае не нужно пользователя ограничивать. Если у него пароль в 100 символов, пусть вводит его как есть. Пусть из них ты будешь использовать только 72, плевать. Совершенно плевать. Но пользователю так удобнее.
     
  7. eldor

    eldor Активный пользователь

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    Из данного общения в данной теме я уже выяснил то, зачем обратился сюда. Всем спасибо за помощь.
     
  8. alexphp

    alexphp Активный пользователь

    С нами с:
    5 дек 2019
    Сообщения:
    98
    Симпатии:
    12
    Тоже задался вопросом регулярных выражений для кириллицы. Исследование показало, что они не работают! Там целый ряд букв выпадает из выражения /^[а-я]+$/. По какому принципу одна буква находится в выражении, а другая нет - совершенно неясно. Выпадает буква "ё" и полный диапазон от "р" до "ю". С английскими буквами такого не происходит. Кодировка UTF-8.

    Отсюда следует, что надо найти более эффективный способ для поиска кириллических символов. Предлагаю использовать mb_strpos (поиск подстроки/символа в строке) вместо preg_match. Вот как это теперь работает:

    Код (Text):
    1. $nameRus = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
    2.   for ($i = 0; $i < mb_strlen($nameRus); $i++)
    3.   {
    4.   echo '$i='."$i"." ".mb_substr($nameRus, $i, 1);
    5.   if (mb_strpos($nameRus, mb_substr($nameRus, $i, 1)) === false)
    6.    echo " ERROR</br>";
    7.   else echo "</br>";
    8.   }
    Ошибка теперь не возникает.

    Ещё про пароли (так как в этой теме об этом тоже говорится). Неясно, почему не следует ограничивать пользователя в длине и подборе пароля? Зачем вообще нужны длинные пароли со сложными символами? Нет, конечно, если есть риск, что пользователя взломает иностранная разведка, тогда, конечно, нужны. Но если пользователь обычный человек, то кому он нужен, чтобы его взламывали? Шесть-семь символов пароля ему вполне достаточно будет! :)