За последние 24 часа нас посетили 39720 программистов и 2346 роботов. Сейчас ищут 1197 программистов ...

Авторизация на токенах и регистрация

Тема в разделе "PHP для новичков", создана пользователем Dimon2x, 13 июн 2017.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Всё работает.
    Правильно ли я, использовал способ токен?

    Правильно ли использовал функцию
    PHP:
    1. ini_set('session.use_only_cookies', true);
    и
    PHP:
    1. output_add_rewrite_var('token', $token);
    А вот это нормальный способ,на 136 строке?
    PHP:
    1. $tokenstr = strval(date('s')) . $salt;
    А саму регистрацию нормально сделал?

    А что мне дают эти токены?

    А как сделать, что бы после закрытия браузера, сессия сохранялась?

    PHP:
    1. <?php
    2. ini_set('session.use_only_cookies', true);
    3.  
    4. $host = 'localhost';
    5. $db = 'token';
    6. $user = 'root';
    7. $pass = '';
    8. $charset = 'utf8';
    9.  
    10. $dsn = "mysql:host=$host; dbname=$db;charset=$charset";
    11.  
    12. $opt = [
    13.     PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    14.     PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    15.     PDO::ATTR_EMULATE_PREPARES   => false,
    16.     ];
    17.    
    18. $pdo = new PDO($dsn, $user, $pass, $opt);
    19.  
    20.  
    21. ?>
    22. <!DOCTYPE html>
    23. <html>
    24.     <head>
    25.         <title>Токен</title>
    26.         <meta charset="utf-8">
    27.         <style>
    28.             .mudak {
    29.                 color: red;
    30.                 font-weight: bold;
    31.             }
    32.         </style>
    33.     </head>
    34.     <body>
    35.     <?php
    36.         if(!empty($_GET['action'])) {
    37.             if($_GET['action'] == 'exit') {
    38.                 unset($_SESSION['token']);
    39.                 session_destroy();
    40.                 header('Location: ./index.php');
    41.             }
    42.         }
    43.        
    44.         if(!empty($_SESSION['token'])) {
    45.             echo '<p>Теперь у вас есть полный доступ к сайту <a href="?action=exit">Выход</a></p>';
    46.             echo $_SESSION['token'];
    47.             die();
    48.         }
    49.        
    50.         else {
    51.             echo '<p>Авторизируйтесь, что бы увидеть содержимое сайта</p>';
    52.            
    53.             require_once 'auth.php';
    54.            
    55.             echo '<p><strong>Или зарегистрируйтесь</strong></p>';
    56.            
    57.             require_once 'registr.php';
    58.            
    59.             /*
    60.             *
    61.             *
    62.             *******Начало регистрации*********
    63.             *
    64.             *
    65.             */
    66.            
    67.             if(!empty($_POST['reg'])) {
    68.                 if(!empty($_POST['login']) && !empty($_POST['password'])) {
    69.                
    70.                     $login = $_POST['login'];
    71.                     $secret = 'hhJNE63';
    72.                     $password = md5($_POST['password'].$secret);
    73.                    
    74.                     $userExists = "SELECT login FROM users WHERE login = '".$login."'";
    75.                     $queryUser = $pdo->query($userExists);
    76.                     $queryUser->setFetchMode(PDO::FETCH_ASSOC);
    77.            
    78.                 if((count($queryUser->fetchAll()) > 0)) {
    79.                     echo '<p>Такой пользователь уже существует<p>';
    80.                     die();
    81.                 }
    82.                 else {
    83.                     $newUser = "INSERT INTO users(login, password) VALUES(:login, :password)";
    84.                     $newUserPrepare = $pdo->prepare($newUser);
    85.                     $newUserPrepare->bindValue(':login', trim($login), PDO::PARAM_STR);
    86.                     $newUserPrepare->bindValue(':password', trim($password), PDO::PARAM_STR);
    87.                     $newUserPrepare->execute();
    88.                     echo '<p>Регистрация завершена</p>';
    89.                 }
    90.                 }
    91.                
    92.                 else {
    93.                     echo '<p class="mudak">Заполните все поля</p>';
    94.                 }
    95.             }
    96.            
    97.             /*
    98.             *
    99.             *
    100.             *******Конец регистрации*********
    101.             *
    102.             *
    103.             */
    104.            
    105.            
    106.             /*
    107.             *
    108.             *
    109.             *******Начало авторизации*********
    110.             *
    111.             *
    112.             */
    113.            
    114.             if(!empty($_POST['auth'])) {
    115.                 if(!empty($_POST['login']) && !empty($_POST['password'])) {
    116.                
    117.                     $login = $_POST['login'];
    118.                     $secret = 'hhJNE63';
    119.                     $password = md5($_POST['password'].$secret);
    120.                
    121.                     $user = "SELECT `login`, `password` FROM users WHERE login = :login AND password = :password";
    122.                     $resUser = $pdo->prepare($user);
    123.                     $resUser->bindValue(':login', trim($login), PDO::PARAM_STR);
    124.                     $resUser->bindValue(':password', trim($password), PDO::PARAM_STR);
    125.                    
    126.                     $resUser->execute();
    127.                     $resUser2 = $resUser->fetchAll();
    128.                    
    129.                     if(count($resUser2) === 0){
    130.                         die('Неверный логин или пароль');
    131.                     }
    132.                     else {
    133.                         $salt = $login;
    134.                         $tokenstr = strval(date('s')) . $salt;
    135.                         $token = md5($tokenstr);
    136.                        
    137.                         $_SESSION['token'] = $token;
    138.                         $_SESSION['user'] = $login;
    139.                         output_add_rewrite_var('token', $token);
    140.                         header('Location: ./index.php');
    141.                    
    142.                     }
    143.                 }
    144.                
    145.                 else {
    146.                     echo '<p class="mudak">Заполните все поля</p>';
    147.                 }
    148.             }
    149.            
    150.             /*
    151.             *
    152.             *
    153.             *******Конец авторизации*********
    154.             *
    155.             *
    156.             */
    157.         }
    158.     ?>
    159.     </body>
    160. </html>  
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Так, как ты написал, токены бесполезны. От них есть толк, если потом их везде за собой таскать по запросам, и каждый раз проверять соответствие токена, пришедшего в запросе, тому, что в сессии. Защищает от CSRF-атак.

    Записать в базу и в куку случайную строку, сравнивать, если пришла правильная кука - авторизировать пользователя.
     
  3. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    А зачем в базу записывать?
    --- Добавлено ---
    не понял, а потом эту строку каждый раз записывать в БД?
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну чтоб знать, какому пользователю принадлежит этот токен
     
  5. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Я вот так сделал, только теперь, при каждом обновлении страницы, меняется название сессии

    PHP:
    1. <?php
    2. ini_set('session.use_only_cookies', true);
    3.  
    4. $host = 'localhost';
    5. $db = 'token';
    6. $user = 'root';
    7. $pass = '';
    8. $charset = 'utf8';
    9.  
    10. $dsn = "mysql:host=$host; dbname=$db;charset=$charset";
    11.  
    12. $opt = [
    13.     PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    14.     PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    15.     PDO::ATTR_EMULATE_PREPARES   => false,
    16.     ];
    17.    
    18. $pdo = new PDO($dsn, $user, $pass, $opt);
    19.  
    20.  
    21. ?>
    22. <!DOCTYPE html>
    23. <html>
    24.     <head>
    25.         <title>Токен</title>
    26.         <meta charset="utf-8">
    27.         <style>
    28.             .mudak {
    29.                 color: red;
    30.                 font-weight: bold;
    31.             }
    32.         </style>
    33.     </head>
    34.     <body>
    35.     <?php
    36.         if(!empty($_GET['action'])) {
    37.             if($_GET['action'] == 'exit') {
    38.                 unset($_SESSION['token']);
    39.                 session_destroy();
    40.                 setcookie ("user", "", time()-3600);
    41.                 header('Location: ./index.php');
    42.             }
    43.         }
    44.        
    45.         if(!empty($_SESSION['token']) || !empty($_COOKIE['user'])) {
    46.             $sql = "SELECT login, password FROM users WHERE randomSTR = '" .  $_COOKIE['user'] . "'";
    47.            
    48.             $queryUser = $pdo->query($sql);
    49.             $queryUser->setFetchMode(PDO::FETCH_ASSOC);
    50.             $userArray = $queryUser->fetchAll();
    51.            
    52.             if(!empty($userArray[0]['login'])) {
    53.                 $login = $userArray[0]['login'];
    54.                
    55.                 $salt = $login;
    56.                 $tokenstr = strval(date('s')) . $salt;
    57.                 $token = md5($tokenstr);
    58.                        
    59.                 $_SESSION['token'] = $token;
    60.                 output_add_rewrite_var('token', $token);
    61.             }
    62.            
    63.             else {
    64.                 die('<p>Авторизируйтесь, что бы увидеть содержимое сайта</p>');
    65.             }
    66.            
    67.            
    68.             echo '<p>Теперь у вас есть полный доступ к сайту <a href="?action=exit">Выход</a></p>';
    69.            
    70.             echo $_SESSION['token'];
    71.            
    72.         }
    73.        
    74.         else {
    75.             echo '<p>Авторизируйтесь, что бы увидеть содержимое сайта</p>';
    76.            
    77.             require_once 'auth.php';
    78.            
    79.             echo '<p><strong>Или зарегистрируйтесь</strong></p>';
    80.            
    81.             require_once 'registr.php';
    82.            
    83.             /*
    84.             *
    85.             *
    86.             *******Начало регистрации*********
    87.             *
    88.             *
    89.             */
    90.            
    91.             if(!empty($_POST['reg'])) {
    92.                 if(!empty($_POST['login']) && !empty($_POST['password'])) {
    93.                
    94.                     $login = $_POST['login'];
    95.                     $secret = 'hhJNE63';
    96.                     $password = md5($_POST['password'].$secret);
    97.                    
    98.                     $userExists = "SELECT login FROM users WHERE login = '".$login."'";
    99.                     $queryUser = $pdo->query($userExists);
    100.                     $queryUser->setFetchMode(PDO::FETCH_ASSOC);
    101.            
    102.                 if((count($queryUser->fetchAll()) > 0)) {
    103.                     echo '<p>Такой пользователь уже существует<p>';
    104.                     die();
    105.                 }
    106.                 else {
    107.                     $newUser = "INSERT INTO users(login, password) VALUES(:login, :password)";
    108.                     $newUserPrepare = $pdo->prepare($newUser);
    109.                     $newUserPrepare->bindValue(':login', trim($login), PDO::PARAM_STR);
    110.                     $newUserPrepare->bindValue(':password', trim($password), PDO::PARAM_STR);
    111.                     $newUserPrepare->execute();
    112.                     echo '<p>Регистрация завершена</p>';
    113.                 }
    114.                 }
    115.                
    116.                 else {
    117.                     echo '<p class="mudak">Заполните все поля</p>';
    118.                 }
    119.             }
    120.            
    121.             /*
    122.             *
    123.             *
    124.             *******Конец регистрации*********
    125.             *
    126.             *
    127.             */
    128.            
    129.            
    130.             /*
    131.             *
    132.             *
    133.             *******Начало авторизации*********
    134.             *
    135.             *
    136.             */
    137.            
    138.             if(!empty($_POST['auth'])) {
    139.                 if(!empty($_POST['login']) && !empty($_POST['password'])) {
    140.                
    141.                     $login = $_POST['login'];
    142.                     $secret = 'hhJNE63';
    143.                     $password = md5($_POST['password'].$secret);
    144.                
    145.                     $user = "SELECT `login`, `password` FROM users WHERE login = :login AND password = :password";
    146.                     $resUser = $pdo->prepare($user);
    147.                     $resUser->bindValue(':login', trim($login), PDO::PARAM_STR);
    148.                     $resUser->bindValue(':password', trim($password), PDO::PARAM_STR);
    149.                    
    150.                     $resUser->execute();
    151.                     $resUser2 = $resUser->fetchAll();
    152.                    
    153.                     if(count($resUser2) === 0){
    154.                         die('Неверный логин или пароль');
    155.                     }
    156.                     else {
    157.                         $arr = ['f', 3, 'g', 'bd', 5, 'p', 'k', 'n', 'v', 'w', 33, 'c', 'o'];
    158.                         shuffle($arr);
    159.                        
    160.                         $str = '';
    161.                        
    162.                         foreach($arr as $k) {
    163.                             $str .= $k;
    164.                         }
    165.                        
    166.                         $sql = "UPDATE users SET randomSTR ='" . $str . "' WHERE login = '" . $login . "'";
    167.                        
    168.                         $queryToket = $pdo->query($sql);
    169.                        
    170.                         setcookie ("user", $str, time()+3600);
    171.                        
    172.                        
    173.                         $salt = $login;
    174.                         $tokenstr = strval(date('s')) . $salt;
    175.                         $token = md5($tokenstr);
    176.                        
    177.                         $_SESSION['token'] = $token;
    178.                         output_add_rewrite_var('token', $token);
    179.                         header('Location: ./index.php');
    180.                    
    181.                     }
    182.                 }
    183.                
    184.                 else {
    185.                     echo '<p class="mudak">Заполните все поля</p>';
    186.                 }
    187.             }
    188.            
    189.             /*
    190.             *
    191.             *
    192.             *******Конец авторизации*********
    193.             *
    194.             *
    195.             */
    196.         }
    197.     ?>
    198.     </body>
    199. </html>  
    --- Добавлено ---
    Изменил на это

    PHP:
    1. if(empty($_SESSION['token']) && !empty($_COOKIE['user'])) {
    2.             $sql = "SELECT login, password FROM users WHERE randomSTR = '" .  $_COOKIE['user'] . "'";
    3.            
    4.             $queryUser = $pdo->query($sql);
    5.             $queryUser->setFetchMode(PDO::FETCH_ASSOC);
    6.             $userArray = $queryUser->fetchAll();
    7.            
    8.             if(!empty($userArray[0]['login'])) {
    9.                 $login = $userArray[0]['login'];
    10.                
    11.                 $salt = $login;
    12.                 $tokenstr = strval(date('s')) . $salt;
    13.                 $token = md5($tokenstr);
    14.                        
    15.                 $_SESSION['token'] = $token;
    16.                 output_add_rewrite_var('token', $token);
    17.             }
    18.         }
    19.        
    20.         if(!empty($_SESSION['token']) ) {
    21.            
    22.             echo '<p>Теперь у вас есть полный доступ к сайту <a href="?action=exit">Выход</a></p>';
    23.            
    24.             echo $_SESSION['token'];
    25.            
    26.         }
    --- Добавлено ---
    Но теперь получается, хакер может подставлять значение в куку и если оно совпадёт, то произойдёт авторизация
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ему ещё надо его откуда-то взять, поэтому мы генерируем случайную строку. Но код у тебя странный
     
  7. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Почему странный?
     
  8. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Вот так сделал удаление статьи, с помощью токена, правильно ли

    PHP:
    1. <?php
    2.  
    3. echo '<p>Добавить статью</p>';
    4.  
    5. require_once 'add.php';
    6.  
    7. echo '<p>Мои статьи</p>';
    8.  
    9. $myArticle = "SELECT article.id, title, user_id FROM article INNER JOIN users ON article.user_id = " . $_SESSION['id'] . " GROUP BY article.title";
    10. $sth = $pdo->query($myArticle);
    11. $sth->setFetchMode(PDO::FETCH_ASSOC);
    12. $userArticle = $sth->fetchAll();
    13.  
    14. echo '<pre>';
    15. print_r($userArticle);
    16. echo '</pre>';
    17.  
    18.  
    19. echo '<table>';
    20. echo '<tr>';
    21.     echo '<td>Название</td>';
    22.     echo '<td>Действие</td>';
    23. echo '</tr>';
    24.  
    25. foreach($userArticle as $key) {
    26.     echo '<tr>';
    27.     echo '<td>'.$key['title'].'</td>';
    28.     echo '<td><form method="post">
    29.        <input type="hidden" name="id-title" value="'.$key['id'].'">
    30.        <input type="hidden" name="id-user" value="'.$key['user_id'].'">
    31.        <input type="submit" name="del-article" value="Удалить">
    32.    </form></td>';
    33.     echo '</tr>';
    34. }
    35. echo '<table>';
    36.  
    37. if(!empty($_POST['del-article'])) {
    38.    
    39.     $sql = "SELECT article.id, `title`, `user_id`, users.randomSTR FROM article INNER JOIN users ON article.id = '".$_POST['id-title']."' AND article.user_id = '".$_POST['id-user']."' AND users.randomSTR = '".$_COOKIE['user']."' GROUP BY article.title";
    40.     $sth = $pdo->query($sql);
    41.     $sth->setFetchMode(PDO::FETCH_ASSOC);
    42.     $delArticle = $sth->fetchAll();
    43.    
    44.     if(count($delArticle[0]) > 1) {
    45.         $sqlDelArticle = "DELETE FROM article WHERE id = :id";
    46.         $del = $pdo->prepare($sqlDelArticle);
    47.         $del->bindValue(':id', $_POST['id-title'], PDO::PARAM_INT);
    48.         $del->execute();
    49.         echo 'Удалено';
    50.     }
    51.    
    52.     else {
    53.         echo 'Ошибка удаления';
    54.     }
    55.    
    56.     /*
    57.     echo '<pre>';
    58.     print_r($delArticle);
    59.     echo '<pre>';
    60.     echo count($delArticle[0]);
    61.     */
    62.    
    63.    
    64. }
    65.  
    66.  
    67. ///SELECT article.id, title, user_id FROM article LEFT JOIN users ON article.user_id = 3 GROUP BY article.title;
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Нафига ты токен создавал, если нигде его не проверяешь?
    --- Добавлено ---
    Весь смысл в том, что
    PHP:
    1. if ($_GET["token"] !== $_SESSION["token"]) {
    2.     unset($_SESSION["user_id"]);
    3.     header("Location: /login.php");
    4.     die;
    5. }
    Без этого пользы от его генерации нету.
    --- Добавлено ---
    Это вообще бред. У тебя удалять могут только те, кто поставил галочку "запомнить меня"? Или у тебя все запоминаются? Ты путаешь назначения инструментов - случайной строки в куках (для того, чтобы пользователь автоматом перелогинивался при каждом заходе на сайт) и токена сессии (для того, чтобы никто не подменил запрос)
     
  10. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Пока что, все запоминаются.

    Как пользоваться токенами, я так и не понял
    --- Добавлено ---
    А сейчас же, уже не могут подменить запрос
     
  11. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Изменил запись токена в регистрации и в авторизации

    Так правильно?

    Удаление сделал по условию

    PHP:
    1. if(!empty($_POST['del-article'])) {
    2.    
    3.         if($_POST['token'] == $_SESSION['token']) {
    PHP:
    1. /*
    2.             *
    3.             *
    4.             *******Начало регистрации*********
    5.             *
    6.             *
    7.             */
    8.            
    9.             if(!empty($_POST['reg'])) {
    10.                 if(!empty($_POST['login']) && !empty($_POST['password'])) {
    11.                
    12.                     $login = $_POST['login'];
    13.                     $secret = 'hhJNE63';
    14.                     $password = md5($_POST['password'].$secret);
    15.                    
    16.                     $userExists = "SELECT login FROM users WHERE login = '".$login."'";
    17.                     $queryUser = $pdo->query($userExists);
    18.                     $queryUser->setFetchMode(PDO::FETCH_ASSOC);
    19.            
    20.                 if((count($queryUser->fetchAll()) > 0)) {
    21.                     echo '<p>Такой пользователь уже существует<p>';
    22.                     die();
    23.                 }
    24.                 else {
    25.                     $newUser = "INSERT INTO users(login, password) VALUES(:login, :password)";
    26.                     $newUserPrepare = $pdo->prepare($newUser);
    27.                     $newUserPrepare->bindValue(':login', trim($login), PDO::PARAM_STR);
    28.                     $newUserPrepare->bindValue(':password', trim($password), PDO::PARAM_STR);
    29.                     $newUserPrepare->execute();
    30.                     echo '<p>Регистрация завершена</p>';
    31.                 }
    32.                 }
    33.                
    34.                 else {
    35.                     echo '<p class="mudak">Заполните все поля</p>';
    36.                 }
    37.             }
    38.            
    39.             /*
    40.             *
    41.             *
    42.             *******Конец регистрации*********
    43.             *
    44.             *
    45.             */
    46.            
    47.            
    48.             /*
    49.             *
    50.             *
    51.             *******Начало авторизации*********
    52.             *
    53.             *
    54.             */
    55.            
    56.             if(!empty($_POST['auth'])) {
    57.                 if(!empty($_POST['login']) && !empty($_POST['password'])) {
    58.                
    59.                     $login = $_POST['login'];
    60.                     $secret = 'hhJNE63';
    61.                     $password = md5($_POST['password'].$secret);
    62.                
    63.                     $user = "SELECT `id`, `login`, `password` FROM users WHERE login = :login AND password = :password";
    64.                     $resUser = $pdo->prepare($user);
    65.                     $resUser->bindValue(':login', trim($login), PDO::PARAM_STR);
    66.                     $resUser->bindValue(':password', trim($password), PDO::PARAM_STR);
    67.                    
    68.                     $resUser->execute();
    69.                     $resUser2 = $resUser->fetchAll();
    70.                     $userId = $resUser2[0]['id'];
    71.                    
    72.                     if(count($resUser2) === 0){
    73.                         die('Неверный логин или пароль');
    74.                     }
    75.                     else {
    76.                        
    77.                         $salt = $login;
    78.                         $tokenstr = strval(date('s')) . $salt;
    79.                         $token = md5($tokenstr);
    80.                        
    81.                        
    82.                         $sql = "UPDATE users SET token ='" . $token . "' WHERE login = '" . $login . "'";
    83.                        
    84.                         $queryToket = $pdo->query($sql);
    85.                        
    86.                         setcookie ("user", $token, time()+3600);
    87.                        
    88.                        
    89.                         $_SESSION['token'] = $token;
    90.                         $_SESSION['user'] = $login;
    91.                         $_SESSION['id'] = $userId;
    92.                         output_add_rewrite_var('token', $token);
    93.                         header('Location: ./index.php');
    94.                    
    95.                     }
    96.                 }
    PHP:
    1. <?php
    2.  
    3. echo '<p>Добавить статью</p>';
    4.  
    5. require_once 'add.php';
    6.  
    7. echo '<p>Мои статьи</p>';
    8.  
    9. $myArticle = "SELECT article.id, title, user_id FROM article INNER JOIN users ON article.user_id = " . $_SESSION['id'] . " GROUP BY article.title";
    10. $sth = $pdo->query($myArticle);
    11. $sth->setFetchMode(PDO::FETCH_ASSOC);
    12. $userArticle = $sth->fetchAll();
    13.  
    14. echo '<table>';
    15. echo '<tr>';
    16.     echo '<td>Название</td>';
    17.     echo '<td>Действие</td>';
    18. echo '</tr>';
    19.  
    20. foreach($userArticle as $key) {
    21.     echo '<tr>';
    22.     echo '<td>'.$key['title'].'</td>';
    23.     echo '<td><form method="post">
    24.        <input type="hidden" name="id-title" value="'.$key['id'].'">
    25.        <input type="hidden" name="token" value="' .$_SESSION['token'].'">
    26.        <input type="submit" name="del-article" value="Удалить">
    27.    </form></td>';
    28.     echo '</tr>';
    29. }
    30. echo '<table>';
    31.  
    32.  
    33.     if(!empty($_POST['del-article'])) {
    34.    
    35.         if($_POST['token'] == $_SESSION['token']) {
    36.    
    37.         $sql = "SELECT article.id, `title`, `user_id`, users.id, users.token FROM article INNER JOIN users ON article.id = '".$_POST['id-title']."' AND article.user_id = '".$_SESSION['id']."' AND users.token = '".$_COOKIE['user']."' AND users.id = '".$_SESSION['id']."' GROUP BY article.title";
    38.         $sth = $pdo->query($sql);
    39.         $sth->setFetchMode(PDO::FETCH_ASSOC);
    40.         $delArticle = $sth->fetchAll();
    41.    
    42.         if(count($delArticle[0]) > 1) {
    43.             $sqlDelArticle = "DELETE FROM article WHERE id = :id";
    44.             $del = $pdo->prepare($sqlDelArticle);
    45.             $del->bindValue(':id', $_POST['id-title'], PDO::PARAM_INT);
    46.             $del->execute();
    47.             echo 'Удалено';
    48.         }
    49.        
    50.         else {
    51.             echo 'Ошибка удаления';
    52.         }
    53.     }
    54.    
    55. }
     
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Вот это уже больше похоже на правду. ТОлько строгое равенство сделай
    Но вообще, если ты уж завёл token в сессии, таскай его вообще во всех ссылках и проверяй в каждом запросе.

    Строго говоря, если я у тебя авторизировался, то во все ссылки на сайте добавляется example.com/url?token=jfsjfghlskjghsdlljhjhlafd, и каждый раз, помимо авторизации пользователя, ты проверяешь, передан ли этот токен в гете. И если не передан, разавторизируешь сразу. Можно ещё для них всякие сроки жизни придумывать и т.п.
     
    Dimon2x нравится это.
  13. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Сделал регистрацию, что бы нельзя было допустить sql инъекцию, нормально ли?

    PHP:
    1.     function registr($login, $password, $email) {
    2.         $input_email = filter_var($email, FILTER_VALIDATE_EMAIL);
    3.         $pass = password_hash($passwod, PASSWORD_DEFAULT);
    4.  
    5.        
    6.         if($input_email === false) {
    7.             echo '<p>Введите правильно email</p>';
    8.             die();
    9.         }
    10.        
    11.         $newLogin = str_replace(";","",$login);
    12.         $newLogin2 = str_replace(")","",$newLogin);
    13.         $newLogin3 = str_replace("'","",$newLogin2);
    14.        
    15.         $userExists = "SELECT DISTINCT login FROM users WHERE login = '".$newLogin3."'";
    16.         $queryUser = $this->db->query($userExists);
    17.         $queryUser->setFetchMode(PDO::FETCH_ASSOC);
    18.        
    19.         if((count($queryUser->fetchAll()) > 0)) {
    20.             echo '<p>Такой пользователь уже существует</p>';
    21.             die();
    22.         }
    23.        
    24.  
    25.         else {
    26.             $newUser = "INSERT INTO users(login, password, email) VALUES(:login, :password, :email)";
    27.             $newUserPrepare = $this->db->prepare($newUser);
    28.             $newUserPrepare->bindValue(':login', trim($newLogin3), PDO::PARAM_STR);
    29.             $newUserPrepare->bindValue(':password', trim($pass), PDO::PARAM_STR);
    30.             $newUserPrepare->bindValue(':email', trim($input_email), PDO::PARAM_STR);
    31.             $newUserPrepare->execute();
    32.             echo '<p>Регистрация завершена</p>';
    33.             echo '<p><a href="?index">Перейти на главную страницу сайта</a></p>';
    34.            
    35.         }
    36.        
    37.     }
     
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Вроде умеешь подготовленными запросами пользоваться, нахрена такую чушь рисовать?
     
  15. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    подготовленные запросы, эти символы не удаляют
     
  16. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    А зачем их удалять?
     
  17. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Потому что могут зарегистрировать такой ник Evil'); DROP TABLE drop_table;--
     
  18. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    если запрос слать отдельно а данные отдельно то у него такой ник запишется в базу))
     
  19. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну и пусть. Это не сработает, если запросы подготовлены
     
  20. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Сделал авторизацию, с помощью password_verify и после авторизации, сразу добавил токен в GET параметр, так правильно?

    PHP:
    1.     function Login($login, $password) {
    2.         $newLogin = str_replace(";","",$login);
    3.         $newLogin2 = str_replace(")","",$newLogin);
    4.         $newLogin3 = str_replace("'","",$newLogin2);
    5.        
    6.         $sqlPass = "SELECT DISTINCT `id`, `login`, `password` FROM users WHERE login = :log";
    7.         $resPass = $this->db->prepare($sqlPass);
    8.         $resPass->bindValue(':log', trim($newLogin3), PDO::PARAM_STR);
    9.         $resPass->execute();
    10.        
    11.         $allRes = $resPass->fetchAll();
    12.         $needPassword = $allRes[0]['password'];
    13.         $userId = $allRes[0]['id'];
    14.         $userLogin = $allRes[0]['login'];
    15.        
    16.        
    17.         $hash = $needPassword;
    18.  
    19.         if (password_verify($password, $hash)) {
    20.            
    21.             $salt = 'slovo';
    22.             $tokenstr = strval(date('s')) . $salt;
    23.             $token = md5($tokenstr);
    24.                        
    25.                        
    26.             $sql = "UPDATE users SET token ='" . $token . "' WHERE login = :log2";
    27.             $queryToket = $this->db->prepare($sql);
    28.             $queryToket->bindValue(':log2', trim($newLogin3), PDO::PARAM_STR);
    29.             $queryToket->execute();
    30.                        
    31.             setcookie ("user", $token, time()+604800);
    32.                    
    33.             $_SESSION['token'] = $token;
    34.             $_SESSION['userPdd'] = $userLogin;
    35.             $_SESSION['id'] = $userId;
    36.             output_add_rewrite_var('token', $token);
    37.             header('Location: ./index.php?token='.$_SESSION['token']);
    38.            
    39.            
    40.         }
    41.         else {
    42.             die('Неверный логин или пароль');
    43.         }
    44.        
    45.     }
     
  21. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
  22. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    А выход, тоже делать по токену или можно просто так?
     
  23. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    чуваки, отсыпьте мне тоже этих ваших токенов, а? )
     
  24. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    форум отсыпал уже