За последние 24 часа нас посетили 17637 программистов и 1724 робота. Сейчас ищут 1867 программистов ...

Мой первый сайт на PHP

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

  1. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    для этого надо делать контроль прав... если их не будет, то в принципе и пост запрос можно подменить и удалять что угодно..
     
    TeslaFeo нравится это.
  2. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    @Dimon2x Проверяешь, чтобы статья принадлежала пользователю, который её удаляет :)
     
  3. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Поэтому у меня в скриптах личного кабинета запросы обычно такие:
    PHP:
    1. $mysqli->query("delete from articles where article_id=" . (int) $article_id " and owner_id=$_SESSION[currentUserId]");
    Ну это как простейший случай. Если есть всякие модераторы, администраторы, которые могут любые статьи удалять откуда угодно, то тогда просто проверяешь доп. условие, типа, если текущий пользователь администатор, или модератор, или владелец, то позволить удалить. Хотя, когда это усложняется, есть смысл уже использовать готовые модули ACL, из фреймворков или отдельные
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    вот как я такое творю:
    PHP:
    1. try{
    2.   throwOnTrue(empty($_POST['raid']));
    3.   throwOnTrue(empty($_POST['dkp']));
    4.   $raid = DB::firstrow('SELECT * FROM `raids` WHERE `dkp`=' . (int)$_POST['dkp'] . ' AND `approved` IS NULL AND `dkp_raid_number` = ' . (int)$_POST['raid']);
    5.   ThrowOnBadArray($raid);
    6.   $member = DKP::getMember($raid['dkp']);
    7.   throwOnFalse($member, l(['en-us' => 'You\'r not a member of this DKP', 'ru' => 'Вы не являетесь участником этого состава']));
    8.   ThrowOnFalse($member->right("raid delete") OR $raid['raidleader'] == User::$id, l(['en-us' => 'You have no right to delete this raid', 'ru' => 'У вас нет права удалить этот рейд']));
    9.   ThrowOnFalse(DB::query('UPDATE `raids` SET `deleted_by`=' . (int)User::$id . ' WHERE `id`=' . (int)$raid['id']));
    10.   ThrowOnFalse(DB::query('UPDATE `raidmembers` SET `deleted_by`=' . (int)User::$id . ' WHERE `raid`=' . (int)$raid['id']));
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Суть CSRF как раз в том, что каким бы контроль прав не был, атака пройдет, если ее подсунуть нужному человеку. Потому что она выполняется от его имени. С его правами.

    Можно делать все только на POST, да. Но в том же phpBB все завязано на get, однакож, пробить CSRF ты не сможешь там ни в жисть. Потому что единственно верный путь защиты от CSRF - это добавление к данным уникальных токенов, специфичных для конкретного пользователя в конкретной сессии. Наличие такого токена гарантирует, что запрос послан из источника, сгенерированного нашим сервером.

    Подготовить картиночку, которая пробьет такую защиту, невозможно. Только если у нас нет доступа к компьютеру конкретно взятой жертвы. Но тогда и CSRF не нужен и имеют место проблемы другого плана, которые нас уже не касаются.
     
  6. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ни был
    в данном случае не кто-то был неправ, а каким бы был король. Нет отрицания.
     
    Fell-x27 нравится это.
  7. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Так может получиться, только если в базе не проверяется ид текущего пользователя. Ты не добавляешь id пользователя статьи в базу? А когда ты с ней делаешь какие либо операции, опять ты используешь этот id, он то не фигурирует в get параметрах
     
  8. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
  9. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Не про те токены прочитал. Сурикат о другом. Вот войди в phpmyadmin, и увидишь что-то вроде: http://example.com/phpmyadmin/index.php?token=c52f2d89915400b697563fcf230c6f9e. И этот токен действителен при сеансе работы с одного браузера, определённое время, потом произойдёт разлогирование. При каждом логине токен разный.
     
  10. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Я добавил регистрацию пользователей и возможность, что бы пользователь мог добавлять свой вопрос и удалять, проверьте пожалуйста, теперь возможно ли будет, удалить чужой вопрос?

    В админке удаление не изменял.

    гитхаб, пока не изменял.

    http://phpkurs.16mb.com

    Сделал способом POST

    PHP:
    1. function delUserQuestion($idQuestion, $idUser, $login) {
    2.         $sql = "SELECT `name`, `id`, `user_id`, `user_name` FROM question WHERE id = '".$idQuestion."' AND user_id = '".$idUser."' AND user_name = '".$login."'";
    3.         $res = $this->db->query($sql);
    4.         $res->setFetchMode(PDO::FETCH_ASSOC);
    5.         $res2 = $res->fetchAll();
    6.      
    7.         if($res2[0] > 0) {
    8.             $sqlDelQuestion = "DELETE FROM question WHERE id = :id";
    9.             $del = $this->db->prepare($sqlDelQuestion);
    10.             $del->bindValue(':id', $idQuestion, PDO::PARAM_INT);
    11.             $del->execute();
    12.             echo 'Вопрос удалён';
    13.         }
    14.      
    15.         else {
    16.             echo 'Ошибка удаления';
    17.         }
    18.     }
    PHP:
    1. <table>
    2.     <tr>
    3.         <td>Вопрос</td>
    4.         <td>Ответ</td>
    5.         <td>Автор</td>
    6.         <td>Действие</td>
    7.     </tr>
    8.     <?php
    9.         foreach($list as $tr) {
    10.             echo '<tr>
    11.                <td>'.$tr['name'].'</td>
    12.                <td>'.$tr['answer'].'</td>
    13.                <td>'.$tr['user_name'].'</td>
    14.                <td>
    15.                    <form method="POST">
    16.                        <input type="hidden" name="id-user-question" value="'.$tr['question_id'].'">
    17.                        <input type="hidden" name="id-user" value="'.$tr['user_id'].'">
    18.                        <input type="hidden" name="login" value="'.$tr['user_name'].'">
    19.                        <input type="submit" name="del-user-question" value="Удалить">
    20.                    </form>
    21.                </td>
    22.            </tr>';
    23.         }
    24.     ?>
    25. </table>
    --- Добавлено ---
    Скрин базы

    555.jpg