простая авторизация Php Mysql

Тема в разделе "PHP программирование", создана пользователем Kauperwood, 16 апр 2011.

Статус темы:
Закрыта.
  1. Kauperwood

    Kauperwood Гость

    исходя из существующего руководства чтобы не теряться в кавычках допилил файлы изменив способ вывода ошибок.
    БД
    Код (Text):
    CREATE TABLE users (
    id mediumint(9) NOT NULL AUTO_INCREMENT,
    login varchar(32) NOT NULL DEFAULT 'CREATE UNIQUE INDEX',
    pass varchar(32) NOT NULL DEFAULT 'NOT NULL',
    email varchar(64) NOT NULL DEFAULT 'CREATE UNIQUE INDEX ',
    `status` tinyint(2) DEFAULT NULL,
    `timestamp` int(10) NOT NULL,
    PRIMARY KEY (id)
    ) ENGINE=MyISAM;
    файл для регистрационной формы (проверяет ошибки в форме и отправляет письмо с кодом активации):
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">registration.php</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    <?php
    session_start();
    $host = "host"; // хост
    $user = "whoisthis"; // пользователь
    $pass = "1234"; // пароль
    $db = "ok_db"; // наша БД
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $rLogin = trim($_POST['rLogin']);
    $rPass = trim($_POST['rPass']);
    $rPass2 = trim($_POST['rPass2']);
    $rEmail = trim($_POST['rEmail']);
    $captha1 = $_POST['captcha'];
    $mdPassword = md5($rPass);
    $time = time();
    // Устанавливаем соединение с бд(не забудьте подставить ваши значения сервер-логин-пароль)
    $link = mysql_connect($host, $user, $pass);

    $errore='';

    if ($rLogin == '') $errore .= "Поле 'Логин' не заполнено<br />\n";
    // Логин может состоять из букв, цифр и подчеркивания
    if (!preg_match("/^\w{3,}$/", $rLogin)) $errore .="В поле 'Логин' введены недопустимые символы<br />\n";
    if ($rEmail == '') $errore .= "Поле 'E-mail' не заполнено<br />\n";
    // Проверяем e-mail на корректность
    if (!preg_match("/^[a-zA-Z0-9_\.\-]+@([a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,6}$/", $rEmail)) $errore .= "Указанный 'E-mail' имеет недопустимый формат<br />\n";

    if ($rPass == '' || $rPass2 == '') $errore .= "Поле 'Пароль' не заполнено<br />\n";
    if ($rPass !== $rPass2) $errore .= "Поля 'Пароль' и 'Повтор пароля' не совпадают<br />\n";
    // Пароль не может состоять из букв, цифр и подчеркивания
    if (!preg_match("/^\w{3,}$/", $rPass)) $errore .= "В поле 'Пароль' введены недопустимые символы<br />\n";
    if (!$captha1) $errore.="не введен защитный код!<br>";
    if ($captha1 != $_SESSION['cap_code']) $errore.="не корректный защитный код!<br>";  
    // В базе данных у нас будет храниться md5-хеш пароля

    if (!$link) $errore .= "Не могу соединиться с базой данных";
    header('Content-Type: text/html; charset= utf-8');
    echo "<b style='color:red;'>$errore</b><br>";

    if (!$errore) {
    $mysqlerr ="";
    mysql_select_db('okrasim_db', $link);

    $cheklogin = mysql_query("SELECT * FROM users WHERE login = '".$rLogin."'",$link);
    $chekmail = mysql_query("SELECT * FROM users WHERE email = '".$rEmail."'",$link);
    if (mysql_num_rows($cheklogin)>0) $mysqlerr .= "Такое имя уже используеться<br />\n";
    if (mysql_num_rows($chekmail)>0) $mysqlerr .= "Такой емануил занят<br />\n";

    header('Content-Type: text/html; charset= utf-8');
    echo "<b style='color:blue;'>$mysqlerr</b><br>";

    if (!$mysqlerr) {

    mysql_query("INSERT INTO users (login, pass, email, timestamp)
    VALUES ('$rLogin','$mdPassword','$rEmail',$time)",$link);
    header('Content-Type: text/html; charset= utf-8');
    echo "Пользователь добавлен<br />\n";

    // Получаем Id, под которым юзер добавился в базу
    $id = mysql_result(mysql_query("SELECT LAST_INSERT_ID()", $link), 0);
    // Составляем "keystring" для активации
    $key = md5(substr($rEmail, 0 ,2).$id.substr($rLogin, 0 ,2));
    $date = date("d.m.Y",$time);


    // Компонуем письмо
    $subject = 'Подтверждение регистрации на сайте ';
    $letter = <<< LTR
    Здравствуйте!
    Ваши регистрационные данные:
    логин: $rLogin
    пароль: $rPass

    Для активации аккаунта вам следует пройти по ссылке:
    http://sayta.net/activation.php?login=$rLogin&key=$key //запрос обработает файл активации
    Данная ссылка будет доступна в течении 5 дней.
    $date
    LTR;
    // Отправляем письмо
    if (!mail($rEmail, $subject, $letter, "Content-Type: text/plain; charset=utf-8\r\n\r\n".$headers)) {
    // Если письмо не отправилось, удаляем юзера из базы
    mysql_query("DELETE FROM users WHERE login='".$login."' LIMIT 1", $link);
    header('Content-Type: text/html; charset= utf-8');
    echo 'Произошла ошибка при отправке письма. Попробуйте зарегистрироваться еще раз.';
    }
    else {
    header('Content-Type: text/html; charset= utf-8');
    echo 'Вы успешно зарегистрировались в системе. На указанный вами
    e-mail было отправлено письмо со ссылкой для активации аккаунта.
    У вас 5 дней!';
    header('Refresh: 3; URL=index.php');
    }
    mysql_close($link);

    } //$mysqlerr
    }//$errore
    }//$_SERVER['REQUEST_METHOD'] == 'POST'
    ?>
    файл активации пользователя:
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">activation.php</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    <?php
    if (isset($_GET['login']) && isset($_GET['key'])) {
    $login = $_GET['login'];
    $key = $_GET['key'];

    $activationerror = "";

    // Делаем проверку login на нехорошие символы
    if (!preg_match("/^\w{3,}$/", $login)) $activationerror .="Неправильная ссылка!<br>";

    $time = time();
    $link = mysql_connect('host','user','password');
    if (!$link) {
    $activationerror .= "Не удалось соединиться с БД!<br>"; mysql_close($link);
    }

    mysql_select_db('okrasim_db', $link);
    $res = mysql_query("SELECT id, email, status, timestamp
    FROM users WHERE login='$login' LIMIT 1", $link);
    // Есть ли пользователь с таким логином?
    if (mysql_num_rows($res) != 1) {
    $activationerror .="Такого пользователя нет!<br>"; mysql_close($link);
    }
    $user = mysql_fetch_row($res);
    // Может он уже активен?
    if ($user[2] == 1) {
    $activationerror .="Данный логин уже подтвержден!<br>"; mysql_close($link);
    }
    // Успел ли юзер активировать логин? (если нет - удаляем из базы)
    if ($user[3] - $time > 5*24*60*60) {
    mysql_query("DELETE FROM users WHERE login='$login' LIMIT 1", $link);
    $activationerror .="Срок активации истёк! Регистрируйтесь заново!<br>";mysql_close($link);
    }
    $key1 = md5(substr($user[1], 0 ,2).$user[0].substr($login, 0 ,2));
    // Проверяем "keystring"
    if ($key1 != $key) {
    $activationerror .="Неправильная контрольная сумма!"; mysql_close($link);
    }
    echo "<b style='color:green;'>".$activationerror."</b><br>";
    if (!$err) {
    // Если все проверки пройдены - активируем логин!

    mysql_query("UPDATE users SET status = 1 WHERE login='$login'", $link);
    echo "Ок вы зарегистрированы!";
    mysql_close($link);
    }

    }
    ?>
    файл авторизации:
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">login.php</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    <?php
    if (isset($_POST['login'])) {
    $passwordHash = md5($_POST['password']);
    $login = $_POST['login'];

    $loginerr="";
    // Проверка логина на плохие смиволы
    if (!preg_match("/^\w{3,}$/", $login)) $loginerr .="Неправильный логин!";
    $link = mysql_connect('host','user','password');
    if (!$link) $loginerr .="Не удалось соединиться с БД";
    mysql_select_db('db', $link);
    $res = mysql_query("SELECT status FROM users WHERE login='$login'AND pass='$passwordHash'", $link);
    // Есть ли пользователь с таким логином?
    if (mysql_num_rows($res) < 1) {
    $loginerr.="Такого пользователя нет, или пароль не верный!";mysql_close($link);
    }
    // Какой статус у пользователя?
    if (mysql_result($res, 0) != 1) {
    $loginerr.="Логин не активирован!";  
    mysql_close($link);
    }

    header('Content-Type: text/html; charset= utf-8');
    echo "<b style='color:grey;'>$loginerr</b><br>";
    if(!$loginerr) {
    // Стартуем сессию и записываем логин в суперглобальный массив $_SESSION
    session_start();
    $_SESSION['user'] = $login;
    mysql_close($link);
    // Если определена страница с которой мы пришли,
    // на нее и переадресуем, либо на главную
    if (isset($_SERVER['HTTP_REFERER'])) {
    header ("location: ".$_SERVER['HTTP_REFERER']);
    }
    else {
    header ("location: index.php");
    }
    }  
    }
    ?>
    и еще чуть не забыл файл для выхода
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">logout.php</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    <?
    session_start();
    if (isset($_SESSION['user'])) {
    // удаляем элемент "user"
    unset($_SESSION['user']);
    }
    if (isset($_SERVER['HTTP_REFERER'])) {
    header ("location: ".$_SERVER['HTTP_REFERER']);
    }else {
    header ("location: index.php");
    }
    ?>
    и две формы ввода данных
    первая для регистрации:
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">registration_form.php</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    <form action="registration.php" method="post">
    <table>
    <tr>
    <td>Логин* :</td>
    <td><input type="text" name="rLogin" value="" size="25" maxlength="30" /></td>
    </tr>
    <tr>
    <td>Пароль* :</td>
    <td><input type="password" name="rPass" value="" size="25" maxlength="30" /></td>
    </tr>
    <tr>
    <td>Повторите пароль* :</td>
    <td><input type="password" name="rPass2" value="" size="25" maxlength="30" /></td>
    </tr>
    <tr>
    <td>E-mail* :</td>
    <td><input type="text" name="rEmail" value="" size="25" maxlength="30" /></td>
    </tr>
    <tr>
    <td>Captcha* :</td>
    <td><img id="cap" src="capa.php"/><input class="capcode" type="text" name="captcha" /></td>
    </tr>
    <tr>

    <td></td>
    <td><input type="reset" name="reset" value="Очистить" />
    <input type="submit" name="ok" value="Готово" /></td>
    </tr>
    </table>
    </form>
    и вторая для логина та что должна быть вставлена в корневой файл:
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">index.php</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    <?
    session_start();
    if (isset($_SESSION['user'])) {
    $auth = "Привет ".$_SESSION['user']."!<br />\n";
    $auth .= "<a href='logout.php'>Выйти</a>";
    $docum = "Эта информация только для зарегистрированных";
    }else {
    $auth = <<< AUTH
    <form method="post" action="login.php">
    <table>
    <tr>
    <td>Логин</td>
    <td><input type="text" name="login"></td>
    </tr>
    <tr>
    <td>Пароль</td>
    <td><input type="password" name="password"></td>
    </tr>
    <tr>
    <td colspan="2"><input type="submit" value="Войти"></td>
    </tr>
    </table>
    </form>
    AUTH;
    $docum = "Эта общая информация";
    }
    ?>
    <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title>авторизация</title>
    </head>
    <body>
    <? echo $auth; ?>
    <hr />
    <? echo $docum; ?>

    <br>
    <a href="reg_form.php">регистрация</a>
    </body>
    </html>
    без реализации кук!
    что мог проверил, должно работать!
    может кому то пригодиться, прикрепил архивом все файлы + моя мини-капча.

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

    Вложения:

    • sayta.net.rar
      Размер файла:
      12,6 КБ
      Просмотров:
      64
  2. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    У себя запустить не удалось, поскольку :) .
    Может плохо искал, но не нашол проверку логина, пароля... на наличие кавычек, как одинарных ' ` так и двойных ".
     
  3. Kauperwood

    Kauperwood Гость

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

    да и после регистрации когда очередь логинится вообще не было проверки пароля - заходи не печалься), посоветовали добавить /// AND pass='$passwordHash'" ///
    "$res = mysql_query("SELECT status FROM users WHERE login='$login'AND pass='$passwordHash'", $link);" в login.php.
    Вообще скрипт одновременно ругается что "Такого пользователя нет, или пароль не верный" + Логин не активирован! - ну с паролем понятно, так как вообще нет отдельной проверки пароля, а вот "Логин не активирован!" напрягает назойливостью.
     
  4. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    1. Ломается как угодно - SQL injection, XSS. Если бы были куки - наверняка и CSRF.
    2. Не понятные буквы выше - гуглить.
    3. Читайте про CMF, MVC, Route. Так как сделали вы делать нельзя.
    4. см.2.

    А потом с вопросами велкам)
     
  5. Kauperwood

    Kauperwood Гость

    по пункту 2, поправлю, Вы хотели сказать про сокращения))
    не сразу уловил)
     
  6. Kauperwood

    Kauperwood Гость

    делал только вывод ошибок в одну переменную, вместо "or die" так как напрягает каждый раз писать "header('Content-Type: text/html; charset= utf-8');".
    Почти все остальное из руководства .
    это не будет критично?
     
  7. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    Учитывая, что это надо переписать целиком, уж простите, нет, это не будет критично.
     
  8. Kauperwood

    Kauperwood Гость

    возможно хочу попробовать,
    тогда, пытаться переписать get как массив функций, взять уже написанные(рекомендуемые), связать их вместе. - норм будет?
    или может второй вариант, сразу на фреймворк но это ж лес поначалу, справочник новый и тому иное.

    PS. видимо плохо искал но хорошую статью-руководство хочется с названием "Когда и с чего начать изучение Zend".))
     
  9. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    Можно и без фреймворка. Что мешает сделать роуты и паттерн MVC руками? Хотя, наверно, с нуля это тяжело по началу. ЛУчше фреймворк, что бы понять.
    А по зенду..
    У вас как с английским? Я не знаю честно говоря, что вам посоветовать почитать для начала. Но есть хорошие видеоуроки по зенду, рассчитанные на не знание фреймворка вообще. На английском, офк.
     
  10. Kauperwood

    Kauperwood Гость

    c EN более менее, уроки - это на zendcasts или другие?
     
  11. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    Есть зендкастс, и есть еще от одного автора.. посмотрю позже чуть.
     
  12. Kauperwood

    Kauperwood Гость

    Vital вы сказали что так делать нельзя (авторизация), и теперь я в тупике. Реально сам не напишу авторизацию. Если не сложно можете посоветовать что нибудь из категории " обычных процедурных подходов"? для начала ведь хоть что то нужно сделать, а если то нельзя и другое нельзя, как быть то, надо этот опыт ведь как то получить. Эта авторизация мне хоть и не нравится, но она хоть работала у меня. Может исходя из нее какие то замечания или может где то в сети есть пример получше или информация?
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей