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

    +158

    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
    function unique_id($extra = 'c')
    {
    	static $dss_seeded = false;
    	global $config;
    
    	$val = $config['rand_seed'] . microtime();
    	$val = md5($val);
    	$config['rand_seed'] = md5($config['rand_seed'] . $val . $extra);
    
    	if ($dss_seeded !== true && ($config['rand_seed_last_update'] < time() - rand(1,10)))
    	{
    		set_config('rand_seed_last_update', time(), true);
    		set_config('rand_seed', $config['rand_seed'], true);
    		$dss_seeded = true;
    	}
    
    	return substr($val, 4, 16);
    }

    Казалось бы, что может быть интересного в генерации случайного числа для хеширования данных?!
    Ан нет, хороший, творческий художник даже такую скучную вещь может превратить в произведение искусства.
    Код взят из самого популярного движка для форумов- phpBB.

    Запостил: Sumanai, 22 Марта 2014

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

    • Мой аналог, немного иного правда назначения:
      public function randomString($length)
          {
              $ret = 97;
              $out = null;
              for ($i = 0; $i < $length; $i++) {
                  $offset = rand(0, 15);
                  $char = chr($ret + $offset);
                  $posibility = rand(0, 2);
                  if ($posibility === 0) {
                      $out .= rand(0, 9);
                  } elseif ($posibility === 1) {
                      $out .= strtoupper($char);
                  } else {
                      $out .= $char;
                  }
              }
              return $out;
          }
      Ответить
      • Магия цифер:
        function randomString(length) {
            var result = [], original = length, chunk,
                seed = (Math.random() * 0x7FFFFFFF) | 0,
                log2 = Math.log(2);
            while (length > 0) {
                chunk = seed.toString(32);
                seed *= 37;
                seed = Math.abs((seed / (Math.log(seed) / log2)) | 0);
                length -= chunk.length;
                result.push(chunk);
            }
            return result.join('').substring(0, original);
        }
        Ответить
        • >>Math.abs((seed / (Math.log(seed) / log2)) | 0);
          Мееедлллееннноо
          Ответить
          • А что делать, если в этом замечательном языке числа могут случайно поменять знак, а получить мантиссу числа с плавающей запятой - вообще нет стандартного способа.
            Ответить
            • А в каком языке есть стандартный способ для получения мантиссы числа с плавающей запятой?
              Ответить
              • в Яве есть floatToIntBits или как-то так. Ну не мантисса, но получить из этого мантиссу - раз плюнуть.

                О, кстати в АС3 есть :) ByteArray.writeFloat.
                Ответить
              • float/10**int(log(float))?
                Ответить
          • кстати.
            function randomString(length) {
                "asm"
                var result = [], length = +length, original = length, chunk,
                    seed = (Math.random() * 0x7FFFFFFF) | 0,
                    log2 = Math.log(2);
                while (length > 0) {
                    chunk = seed.toString(32);
                    seed *= 37;
                    seed = Math.abs((seed / (Math.log(seed) / log2)) | 0);
                    length -= chunk.length;
                    result.push(chunk);
                }
                return result.join('').substring(0, original);
            }

            > Мееедлллееннноо
            fixed?
            Ответить
    • Да, забыл написать. Функция set_config в этом коде пишет в БД. Целых два раза, при генерации рандомного числа.
      Ответить
      • Ну зато автор имел хоть какие-то познания о криптостойких ГПСЧ ;)

        Все же этот код хоть и неэффективен, но получше типичного говна со srand/rand, инициализируемых от таймера.
        Ответить
        • А криптографических ГСЧ в рнр нету?
          Ответить
          • Только openssl_random_pseudo_bytes (если стоит), модуль mcrypt (опять же если есть) или чтение /dev/urandom (не для винды) вроде бы... Пусть опытные PHP'шники меня поправят.
            Ответить
          • Пока гуглил, наткнулся на генератор надежных паролей на пыхе: http://99webtools.com/php-strong-password-generator.php

            Код, достойный отдельного треда:
            function generate_password( $length = 8 ) {
            $chars = "[email protected]#$%^&*()_-=+;:,.?";
            $password = substr( str_shuffle( $chars ), 0, $length );
            return $password;
            }
            Ответить
            • +1
              Перепишу на делпхи.
              Ответить
              • Готово. Зацените.
                var
                  ipass,ppass,chars:string;
                  i,x,len:integer;
                begin
                  ppass:='';
                  i:=0;
                  chars:='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
                  len:=length(chars);
                  for x:=1 to passlen do
                  begin
                    randomize;
                    i := 1+random(len(chars));
                    ppass:=ppass + chars[i];
                  end;
                  result:=ppass;
                Ответить
                • random криптографический юзай.
                  Ответить
                  • Упс, я и не в курсе, что это. (Кэп?)
                    Для обычных мыльных паролей ведь сойдет?
                    Ответить
                    • Сойдет, но лучше криптографический. Загугли delphi crypto RNG или delphi safe password generator.
                      Ответить
        • Ага. Но используется эта функция зачастую для всякой мелочи типа имени файла:
          $this->realname = $prefix . md5(unique_id()) . '.' . $this->extension;


          Или
          function make_unique_filename($filename)
          {
          	if (!strlen($filename))
          	{
          		$filename = md5(unique_id()) . '.dat';
          	}
          	else if ($filename[0] == '.')
          	{
          		$filename = md5(unique_id()) . $filename;
          	}
          	else if (preg_match('/\.([a-z]+)$/i', $filename, $m))
          	{
          		$filename = preg_replace('/\.([a-z]+)$/i', '_' . md5(unique_id()) . '.\1', $filename);
          	}
          	else
          	{
          		$filename .= '_' . md5(unique_id()) . '.dat';
          	}
          
          	return $filename;
          }

          Совершенно криптостойкое имя файла, никто не угадает!
          Ответить
          • Дык для таких применений в php есть uniqueid()...

            > md5(unique_id())
            А вот это прикольно. В return substr($val, 4, 16) он испортил значение, оставив только 16 цифр (8 байт). А теперь растягивает до полного md5. С точки зрения криптографии это лютый фейл...
            Ответить
            • >Дык для таких применений в php есть uniqueid()...
              Конечно есть, о том и речь.
              >А вот это прикольно.
              Надо было всю цепочку выкладывать, оплошал))
              Ответить
          • NamedTempFile?
            Ответить
          • P.S. Кстати, иногда имена файлов тоже представляют ценность - тот же дропбокс, когда ты генеришь ссылку для публичного доступа к файлу.
            Ответить
            • Тут они сохраняются на диск. Разве что тяжелее залитый бекдор найти, так как файлы отдаются скриптом, и их настоящее имя скрыто. Но как уже написали, тут тоже не всё ровно.
              Ответить
    • Кстати, гет!
      Ответить

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