[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ссылка на поле в бд
aziz
помогите разобратса, проблема в том что я при регистрации отправляю пользователю его данные и хочу сделать активацию для этого мне нужно отправить ему его id и уникальный код activ.
id и activ мне надо взять из бд в итоге должно получитса что то типа: пройдите по ссылке
http://moysayt.com/activ.php?=id&уникальный__ключ
но как это сделать не соображу может кто посоветует или покажет пример
С Уважением



Спустя 1 час, 4 минуты, 48 секунд (18.08.2006 - 07:47) zilogo написал(а):
Думаю можно хранить в базе только id.
Берешь какой-нить ключ, напр. 'sdkje2hi34192x32' хэшишь с id и посылаешь юзеру.
Потом
mysql_query("update users set users.`registred`='Y' where users.`registred`='N' and md5(concat(users.`id`, '$key'))='$hash'");

Спустя 20 часов, 27 минут, 48 секунд (19.08.2006 - 04:15) aziz написал(а):
QUOTE
Берешь какой-нить ключ, напр. 'sdkje2hi34192x32' хэшишь с id и посылаешь юзеру.

если сечстно я только учусь и пока с хешом не сталкивался можно ли где нибудь увидеть примеры как это делаетса

Спустя 5 часов, 34 минуты, 42 секунды (19.08.2006 - 09:50) zilogo написал(а):
md5('sdwj2mocm2omc823'.$id)

Спустя 18 минут (19.08.2006 - 10:08) vasa_c написал(а):
Еще вариант есть, вообще ничего не заносить в базу в начале (чтобы не захламлять), а высылать на мыло ссылку, типа:
/registr.php?login=qwerty&password=qwerty&key=034958467845754756756
Где key — хэш, завязанный на логине, пароле и какой-либо секретной строке, например:
$key = md5( $login.$password.'Секретная строка' );
А уже когда пользователь приходит по этой ссылке, регистрировать пользователя с логином/паролем из нее.

Спустя 2 часа, 8 минут, 26 секунд (19.08.2006 - 12:16) Drachoon написал(а):
Зная хэш и то что $key генерируется таким способом можно без труда восстановить и $password и 'Секретная строка' c помощю rainbow tables. Лучше делать так $key = md5(md5( $login.$password.'Секретная строка' )); // хотя если подберётся первый уровень то и второй уровень тоже раздраконить не составит ртуда, но помните что чем длиннее хешируемая стока тем больше шанс найдти коллизию. В данном случае квадратный хэш сломать будет сложнее потому что есть шансы что найденная коллизия не будет соответствовать нужной строке.

Спустя 17 часов, 40 минут, 29 секунд (20.08.2006 - 05:57) aziz написал(а):
Может кто знает где об этом всё подробно описано,желательно м примерами:(

Спустя 4 дня, 19 часов, 50 минут, 57 секунд (25.08.2006 - 01:48) LiZ@RD написал(а):
aziz, о чем? о хешировании?)) хеш-функции - функции необратимого шифрования (т.е. по результату работы функции невозможно найти исходное значение)... функция для хеширования - md5() (не только, конечно, но лучше юзай эту ;) )

Спустя 10 часов, 29 минут, 31 секунда (25.08.2006 - 12:17) phps.ru написал(а):
Самый нормальный способ, это держать таблицу юзеров в таком виде:
id | login | pass | ... | status | activate
.............
.............
.............

После регистрации отправляешь линк следующего вида:
http://.../activate.php?code=blablabla (где blablabla егошний код в ячейке activate)
Далее делаешь SQL запрос обновляющий status с нуля (пользователь не активирован) до единица для поля где activate = $_GET['code']... Самый простой способ, тем не менее работает...

Потом можешь написать крон скрипт который будет чистить бд от неактивироанных в течении допустим месяца аккаунтов....

Спустя 36 минут, 26 секунд (25.08.2006 - 12:54) zilogo написал(а):
Непонимаю зачем некоторые предлагают хэштровать имя+пароль+ключ или держать поле activate в БД.
Самый лучший на мой взгляд метод:
Допустим в БД есть таблица users и в ней поля idUser, login, password, registred
Поле из БД: registred enum('N', 'Y') not null # 'Y' - пользователь прошел регистрацию.
$key = 'sdkje2hi34192x32'; // ключ для хэширования. Храним в файле выше public_html и считываем (или храним прямо в скрипте)
Далее пользователь регистрируется и мы получаем его id
$idUser = mysql_insert_id($res);
Далее хэштруем с нашим ключем
$hash = md5($idUser.$key);
Далее отправляем юзеру ссылку вида
http://www.phpforum.ru/autor.php?id=$idUser&hash=$hash
Далее в скрипте autor.php получаем $idUser и $hash
Далее регистрируем юзера, т.е. присваиваем `registred`='Y'
mysql_query("update users set users.`registred`='Y' where users.`registred`='N' and md5(concat(users.`id`, '$key'))='$hash'");
Т.е. перебираем все поля с незарегистрированными юзерами чей хэш совпадет: md5(concat(users.`id`, '$key'))='$hash'")

Спустя 3 часа, 24 минуты, 34 секунды (25.08.2006 - 16:18) phps.ru написал(а):
zilogo,
твой вариант лучьше моего, но автор просил без использования хешей... как видно по его фразе "я только учусь" человеку нужно показывать самые наипростейшие примеры, для того, что бы он мог в будующем сам их модернизировать и улучшать, хоть и правильно учить изначально кодить логично и корректно.

Спустя 1 час, 7 минут, 48 секунд (25.08.2006 - 17:26) vasa_c написал(а):
QUOTE
Непонимаю зачем некоторые предлагают хэштровать имя+пароль+ключ или держать поле activate в БД.
Самый лучший на мой взгляд метод:

Если пойти дальше, то в БД можно вообще ничего не держать.
Какой смысл всей этой активации через мыло? Чтобы базу не забили всякие чудики и боты. Так зачем забивать ее неактивированными пользователями?
Можно получить от пользователя его мыло и желаемые логин/пароль, на их основании создать по известному только серверу алгоритму строку (тот же md5( $email.$login.$password.'Секретная строка' );) и отправить юзеру на мыло письмо с сылкой:
www. phpforum.ru/activate.php?email=petya@mail.ru&login=petya&password=qwerty&hash=08932573657436549312143534
Пользователь активирует ее, а в activate.php проверяется соответствие логина/пароля с hash и если все пучком, тогда уже регистрируется пользователь.
Имхо, вариант, тоже заслуживающий право на жизнь.

Спустя 29 минут, 45 секунд (25.08.2006 - 17:56) phps.ru написал(а):
в твоем варианте все равно придется держать в бд столбец с значением активирован аккаунт или нет...

или ты предлагаешь ссылку на регистрацию делать такой (если данные собираются с начала):
acticate.php?email=petya@mail.ru&username=petya&fio=Бобров Иван Иваныч&password=qwert&icq=000000000&aim=135135&jabber=245245&phone=+741535....... итд итп...

это бредовый вариант... думаю правильнее сделать так:

человек заходит на сайт, фтыкает линк регистрироваться, заполняет все данные в том числе и мыло, переходит на второй шаг (введенные им данные записались либо в сессию либо прям в HTML в полях hidden хранятся) где у него просится ввести код активации который пришол на мыло по алгоритму md5($email.$login.$pass.$secret_key).... и только после того как чувак ввел код активации с мыла идет проверка и запись в бд если все ок... у данного варианта есть НО:
Бывает что мыло задерживается в доставке, человеку придется держать окно браузера открытым.

Лучше все же держать поле состояния активирования в бд, причем администратор в любой момент при помощи этого сможет блокировать юзеров на сайте...

Спустя 2 минуты, 41 секунда (25.08.2006 - 17:58) vasa_c написал(а):
Если при регистрации тр*цензура*ется множество параметров, то можно разбить ее на 2 шага:
1. email, логин, пароль.
Здесь отправляется письмо и все такое.
2. Ссылка в письме ведет на страницу со 2-м шагом, где уже вводяться ФИО и вся остальная лабуда.

Спустя 8 минут, 45 секунд (25.08.2006 - 18:07) phps.ru написал(а):
как варинт - жив...
на практике проще и разумнее пожертвовать все же одним полем таблички =)

Спустя 4 месяца, 9 дней, 21 час, 18 минут, 43 секунды (5.01.2007 - 16:26) aziz написал(а):
Хотелось бы узнать ваше мнение
<?
session_start();
session_register("secret_number");
 
if (intval($_SESSION["secret_number"])<1000) {
        srand(doubleval(microtime()));
        $_SESSION["secret_number"]=rand(1000,9999);
        //echo $_SESSION["secret_number"]=rand(1000,9999);
        }
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
 
<title>Скрипт регистрации (+MySQL)</title>
</head>
<body bgcolor="#FFFFFF">
<!--Форма регистрации-->
<form action="" method="post" name="reg">
  <table align="center" cellpadding="0" >
    <tr>
      <td colspan="2"> Регистрационная форма</td>
    </tr>
    <tr>
      <td width="91">Ваш логин:</td>
      <td width="233"><input name="login"
     type="text" size="10"></td>
    </tr>
    <tr>
      <td>Ваш пароль:</td>
      <td><input name="passwd"
     type="password" size="10"></td>
    </tr>
    <tr>
      <td height="24">Ваш email:</td>
      <td><input
     type="email" name="email" size="10"></td>
    </tr>
    <tr>
      <td height="32">Ваш IP:</td>
      <td><?php echo $_SERVER['REMOTE_ADDR'];?>
        <input name="hiddenField" type="hidden" value=<?php echo $_SERVER['REMOTE_ADDR'];?> ></td>
    </tr>
    <tr>
      <td height="15">Введите код: </td>
      <td><img src='code.php?<?=doubleval(microtime());?>' width=101 height=26 vspace=5></td>
    </tr>
    <tr>
      <td height="15">&nbsp;</td>
      <td><label>
        <input name="secretcode" type="text" id="secretcode">
        </label></td>
    </tr>
    <tr>
      <Td><input type="submit" name="reggist"
     value="Далее">
        <label></label></td>
      <Td><div align="right">
          <input type="reset" name="Reset" value="Сброс">
        </div></td>
    </tr>
  </table>
</form>
<?php
//Если кнопка была нажата то проверяем данные
if(isset($_POST['reggist'])) {
    $login=$_POST['login'];
    $passwd=$_POST['passwd'];
    $email=$_POST['email'];
    $ip=$_SERVER['REMOTE_ADDR'];
        $date=date("d.M Y");
 
 
        if (eregi("[^a-zA-Z0-9_-]", $login))
{
   echo "Слово может состоять только из больших и маленьких латинских букв, цифр, знака тире -, и подчеркивания _!";
}
else
{
   if(strlen($login) < 4 || strlen($login) > 12)
   {
      echo "Слово должнобыть не длинее 12 и не короче 4 симболов!";
   }
   else
   {
 
 
 
 
 
   if ($login=="") { //если поле логина пустое выдаём сообщение
                   echo "Вы не ввели логин!
";
                    }
                                        else { // проверяем код на картинке с введённм
                                        $error=0;
if ($_POST["secretcode"]!=$_SESSION["secret_number"] || intval($_POST["secretcode"])==0) $error=1;
if ($error==0) {
                $_SESSION["secret_number"]=rand(1000,9999);
                }// если не верно сообщаем...
if ($error==1) print "<font color=red>Число с картинки введено неверно</font>";
 else
    { //иначе проверяем правильность заполнения email адреса
    if (!preg_match("/[0-9a-z_]+@[0-9a-z_^.]+.[a-z]{2,3}/i", $email))
     {
     echo " Неверно введен е-mail. Введите e-mail в виде <i>softtime@softtime.ru</i> 
";
        }
     else
        { //далее проверяем длину пароля, пароль не должен быть менее 3 и не более 16 символов
        if(strlen($passwd)<3)
             {
         echo "Длина пароля должна быть не менее 3-х символов !";
            }
         else
            {
                        if(strlen($passwd)>16)
             {
         echo "Длина пароля должна быть не более 16-х символов !";
            }
         else
            { //если всё верно производим преобразование спецсимволов в их HTML эквиваленты.
            $login = htmlspecialchars(stripslashes($login));
            $email = htmlspecialchars(stripslashes($email));
 
//затем подключаемся к нащей базе
$hostname = "localhost";
$database = "phpless7";
$username = "phpless7";
$password = "ouehbKAP ";
$test = mysql_pconnect($hostname, $username, $password) or die("не могу подключиться к базе");
 
        mysql_select_db($database) or die ("Немогу выбрать базу ");// выбираем базу
 
        //проверяем существует ли такой логин и email  в нащей базе
        $result = mysql_query("SELECT true FROM users WHERE login = '".$login."' OR email='".$email."'");
 
  if(@mysql_num_rows($result)>0 ) {  //если да то извеняемся
  echo "Извините такой логин уже есть
";
  echo "<a href=index.php>На главную страницу</a>";
}
 
else{
//иначе вводим его(её) данные в базу
$query=mysql_query("INSERT into users (id, login, passwd, email, ip, status, date) values ('', '".$login."', '".md5($passwd)."', '".$email."','".$ip."', '','".$date."')");
 
  echo "Поздравляю Вы зарегестрировались!
";
echo "<a href=index.php>На главную страницу</a>";
 
        /*Начинаем процесс составления ХЕШ-подписи, для подтверждения личности
*пользователя при активации
 
**/
 
//Получаем логин пользователя в EMAIL-сети
 
$email_cnx=explode("@",$email);
 
//Формируем подпись
$checkSum=base64_encode(substr($login,0,3).$email_cnx[0].
          md5($_SERVER['REMOTE_ADDR']));
 
//Получаем временную метку
 
$date=time();
 
 
//Добавляем данные во временную таблицу
 
$q=@mysql_query("INSERT into `validate_temp` VALUES('','".$email."','".
                 $checkSum."','".$date."')",$database);
 
if(@mysql_error($database)!='') {
    die("Ошибка в запросе к БД !");
    }
 
//Сообщение зарегистрированному пользователю
 
$message="Сегодня в ".date("d.m.Y",$date)."на сайте ShockStudio.COM был
зарегистрирован
пользователь с вашим email'ом. Поэтому вы получили данное письмо. Если вы не
регистрировались на нашем сайте, то попросту удалите данное письмо, а если
же это были вы то перейдите по нижеприведённой ссылке.
 
Аккаунт будет действителен до
".date("d.m.Y",mktime(0,0,0,date("d",$date)+4,date("m",$date),date("Y",$date))).",
после чего аккаунт зарегистрировать будет невозможно !
 
Ссылка для активации:<a
href="activate.php?checkSum=".$checkSum."&email=".$email."">Перейти</a>;
 
-----------------------------
 
С уважением администрация ShockStudio.COM
Email для контактов:<a href="mailto: Ik1990@list.ru"> Ik1990@list.ru </a>";
 
//Посылаем сообщение пользователю
 
@mail($email,"Активация аккаунта",$message,"Content-Type: text/html;
charset=windows-1251","From: robot@shockstudio.com");
        }
 
 
mysql_close();
 
}
 }
  }
   }
    }
        }}
 
}
   ?>
 
</body>
</html>


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.