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

    +155

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    function generateSession()
    {
        $chars = "qazxswedcvfrtgbnhyujmkiolp1234567890QAZXSWEDCVFRTGBNHYUJMKIOLP";
        $max = rand(20, 32);
        $size = StrLen($chars) - 1;
        $sessionID = null;
        while ($max--)
            $sessionID .= $chars[rand(0, $size)];
        return $sessionID;
    }

    Запостил: taras_shs, 31 Октября 2014

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

    • return md5($time . mt_rand(1, 1000));
      Ответить
      • Только вместо mt_rand лучше openssl_random_pseudo_bytes, если есть такая возможность.
        Ответить
      • Как-то раз на одном сайте, который я частенько посещаю, вдруг отобразилось, что я залогинен. И имя пользователя мне было совершенно незнакомо. Я до сегодняшнего дня думал, что это была счастливая случайность, наступающая где-то раз в 256^16 сессий.
        Ответить
        • Походу кто-то поюзал обычный rand(). Там, по теореме о днях рождения, вероятность того, что из 65536 сессий две совпадут равна 1/2...

          P.S. А ведь в пыхе есть готовые session_start и session_id. Зачем народ воду мутит?
          Ответить
          • Либо совпадут, либо нет? :D
            Ответить
          • Кстати, выше как раз написано, почему не надо юзать готовый session_id - есть вероятность, что однажды ты случайно залогинишься. А вот если писать в куки session только для залогиненных, таких проблем не будет.
            Ответить
            • Вот с готовым как раз, вероятность очень маленькая. А с кодом из топика - запросто совпадут.
              Ответить
              • Смотри. Каждому, зашедшему на сайт, независимо от того, залогинен он или нет, выдается session_id, которые могут быть одинаковые.

                А обычно делают так: пока юзер не залогинен, у него кука session пустая, как только вошел - заполняется сессией. Да, тоже могут совпасть, но, по крайней мере, случайный гость внезапно не окажется на чьем-то аккаунте.
                Ответить
                • session.entropy_length
                  и другие кошерные настройки чем не угодили-то?
                  Ответить
            • > есть вероятность, что однажды ты случайно залогинишься. А вот если писать в куки session только для залогиненных, таких проблем не будет.
              Поможет на сайтах, где много анонов и мало пользователей. А если два пользователя в ту же секунду залогинятся, чем лучше?
              Ответить
              • $session = md5(time() . mt_rand(228, 1488));
                while (mysql_num_rows(mysql_query("SELECT `id` FROM `users` WHERE `session` = '$session'")) != 0) 
                    $session = md5(time() . mt_rand(228, 1488));


                :D
                Ответить
                • Тут ещё надо ещё вставить защиту от кулхацкеров. А то всего 75600 кобенаций в минуту.
                  Ответить
        • А с сегодняшнего дня что изменилось?)
          Ответить
          • Изменилось. Я увидел, можно вовремя обратиться к серверу и разделить с кем-то сессию.
            Ответить

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