Как генерировать безопасную строку активации в php?

Вы можете проверить, что файл data.json записывается в свою выходную папку (код из этого ответа ):

private bool IsFileLocked(FileInfo file) 
{ 
   FileStream stream = null; 
   try 
  { 
    stream = file.Open(FileMode.Open,    FileAccess.ReadWrite, FileShare.None); 
  } 
  catch (IOException)
  { 
//the file is unavailable because it is: 
//still being written to 
//or being processed by another thread 
//or does not exist (has already been processed) 
    return true; 
  }
  finally 
  { 
    if (stream != null) stream.Close(); 
  } 
//file is not locked return 
return false; 
}

19
задан 18 May 2009 в 03:29
поделиться

5 ответов

Лично я просто использую комбинацию таких вещей, как:

$generatedKey = sha1(mt_rand(10000,99999).time().$email);

Вероятность столкновения мала,

25
ответ дан 30 November 2019 в 03:43
поделиться
$guid=md5(uniqid(mt_rand(), true));
1
ответ дан 30 November 2019 в 03:43
поделиться

В основном у вас есть несколько вариантов:

1) Создайте единственный уникальный идентификатор, который, казалось бы, является случайным, и сохраните его в своей базе данных, с именем которого он соответствует

2) Создайте случайный пароль и включите идентификатор пользователя и пароль в ссылку и сохраните пароль в базе данных

3) Используйте одностороннюю функцию хеширования (md5, sah1 и т.д.) и секретный идентификатор для шифрования идентификатора пользователя. Вам не нужно хранить зашифрованный идентификатор пользователя в своей базе данных.

Вариант 1 сложен, потому что вам нужно беспокоиться о проверке базы данных, чтобы увидеть, существует ли уже ключ. Однако приятно, что URL-адрес не содержит активируемого имени пользователя.

Если вы уже собираетесь использовать какую-то базу данных для хранения информации о пользователе (возможно, как минимум, пароль) в будущем, вы можете выбрать вариант 2. Добавление еще одного столбца в базу данных не займет много времени. При отправке электронного письма сохраните имя пользователя и что-то вроде $ key = sha1 (rand (1, 99999). $ Username) в другом столбце для строки, содержащей имя пользователя. Затем пусть ваша ссылка будет выглядеть так: http://you.com/activation.php?user= $ username & key = $ key. В файле activate.php вы проверяете, равен ли ключ значению, хранящемуся в базе данных.

Если вы хотите использовать меньше места для хранения в вашей базе данных, вариант 3 будет работать. Вы можете использовать что-то вроде $ key = sha1 ($ mysecret. $ Username) в качестве секретного идентификатора. Используйте что-нибудь странное, что только вы знаете как $ mysecret, например 'aaafj_my_secret_adfaf'. Используйте тот же тип URL, что и в варианте 2. Однако, поскольку вы можете сгенерировать $ key только на основе $ username, вам не нужно его хранить. Поэтому, когда вы обрабатываете файл activate.php, просто проверьте, не равен ли sha1 ($ mysecret. $ _GET [имя пользователя]) == $ _GET [ключ]. Если да, значит, у вас правильный пользователь. Теоретически, при достаточном количестве регистраций, кто-то может определить вашу ценность для $ mysecret и также сгенерировать ключи активации. Однако вы наверняка заметили бы миллиарды или больше регистраций, которые потребуются, прежде чем они смогут начать вычислять, что это такое. Количество требуемых активаций зависит от размера ключа хеш-функции. Используйте sha1 (160 бит) против md5 (128 бит), чтобы было сложнее угадать значение $ mysecret.

кто-то может определить ваше значение для $ mysecret и также сгенерировать ключи активации. Однако вы наверняка заметили бы миллиарды или больше регистраций, которые потребуются, прежде чем они смогут начать вычислять, что это такое. Количество требуемых активаций зависит от размера ключа хеш-функции. Используйте sha1 (160 бит) против md5 (128 бит), чтобы было сложнее угадать значение $ mysecret.

кто-то может определить ваше значение для $ mysecret и также сгенерировать ключи активации. Однако вы наверняка заметили бы миллиарды или больше регистраций, которые потребуются, прежде чем они смогут начать вычислять, что это такое. Количество требуемых активаций зависит от размера ключа хеш-функции. Используйте sha1 (160 бит) против md5 (128 бит), чтобы было сложнее угадать значение $ mysecret.

8
ответ дан 30 November 2019 в 03:43
поделиться

Если вы сохраняете строку активации в базе данных и проверяете ее позже, вам вообще не нужен хеш!

Вам просто нужна длинная случайная строка. Вы можете генерировать его как хотите, просто сделайте его длинным. Фактически, в идеале он не должен иметь ничего общего с адресом электронной почты или именем пользователя.

1
ответ дан 30 November 2019 в 03:43
поделиться

Это должно сработать, однако вы можете улучшить его, добавив немного соли, например:

$key = sha1($email . 'doYouLikeSauce');

Другой подход - просто сгенерировать случайный пароль и отправить его по электронной почте.

0
ответ дан 30 November 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: