для этого надо делать контроль прав... если их не будет, то в принципе и пост запрос можно подменить и удалять что угодно..
Поэтому у меня в скриптах личного кабинета запросы обычно такие: PHP: $mysqli->query("delete from articles where article_id=" . (int) $article_id " and owner_id=$_SESSION[currentUserId]"); Ну это как простейший случай. Если есть всякие модераторы, администраторы, которые могут любые статьи удалять откуда угодно, то тогда просто проверяешь доп. условие, типа, если текущий пользователь администатор, или модератор, или владелец, то позволить удалить. Хотя, когда это усложняется, есть смысл уже использовать готовые модули ACL, из фреймворков или отдельные
вот как я такое творю: PHP: try{ throwOnTrue(empty($_POST['raid'])); throwOnTrue(empty($_POST['dkp'])); $raid = DB::firstrow('SELECT * FROM `raids` WHERE `dkp`=' . (int)$_POST['dkp'] . ' AND `approved` IS NULL AND `dkp_raid_number` = ' . (int)$_POST['raid']); ThrowOnBadArray($raid); $member = DKP::getMember($raid['dkp']); throwOnFalse($member, l(['en-us' => 'You\'r not a member of this DKP', 'ru' => 'Вы не являетесь участником этого состава'])); ThrowOnFalse($member->right("raid delete") OR $raid['raidleader'] == User::$id, l(['en-us' => 'You have no right to delete this raid', 'ru' => 'У вас нет права удалить этот рейд'])); ThrowOnFalse(DB::query('UPDATE `raids` SET `deleted_by`=' . (int)User::$id . ' WHERE `id`=' . (int)$raid['id'])); ThrowOnFalse(DB::query('UPDATE `raidmembers` SET `deleted_by`=' . (int)User::$id . ' WHERE `raid`=' . (int)$raid['id']));
Суть CSRF как раз в том, что каким бы контроль прав не был, атака пройдет, если ее подсунуть нужному человеку. Потому что она выполняется от его имени. С его правами. Можно делать все только на POST, да. Но в том же phpBB все завязано на get, однакож, пробить CSRF ты не сможешь там ни в жисть. Потому что единственно верный путь защиты от CSRF - это добавление к данным уникальных токенов, специфичных для конкретного пользователя в конкретной сессии. Наличие такого токена гарантирует, что запрос послан из источника, сгенерированного нашим сервером. Подготовить картиночку, которая пробьет такую защиту, невозможно. Только если у нас нет доступа к компьютеру конкретно взятой жертвы. Но тогда и CSRF не нужен и имеют место проблемы другого плана, которые нас уже не касаются.
Так может получиться, только если в базе не проверяется ид текущего пользователя. Ты не добавляешь id пользователя статьи в базу? А когда ты с ней делаешь какие либо операции, опять ты используешь этот id, он то не фигурирует в get параметрах
Не про те токены прочитал. Сурикат о другом. Вот войди в phpmyadmin, и увидишь что-то вроде: http://example.com/phpmyadmin/index.php?token=c52f2d89915400b697563fcf230c6f9e. И этот токен действителен при сеансе работы с одного браузера, определённое время, потом произойдёт разлогирование. При каждом логине токен разный.
Я добавил регистрацию пользователей и возможность, что бы пользователь мог добавлять свой вопрос и удалять, проверьте пожалуйста, теперь возможно ли будет, удалить чужой вопрос? В админке удаление не изменял. гитхаб, пока не изменял. http://phpkurs.16mb.com Сделал способом POST PHP: function delUserQuestion($idQuestion, $idUser, $login) { $sql = "SELECT `name`, `id`, `user_id`, `user_name` FROM question WHERE id = '".$idQuestion."' AND user_id = '".$idUser."' AND user_name = '".$login."'"; $res = $this->db->query($sql); $res->setFetchMode(PDO::FETCH_ASSOC); $res2 = $res->fetchAll(); if($res2[0] > 0) { $sqlDelQuestion = "DELETE FROM question WHERE id = :id"; $del = $this->db->prepare($sqlDelQuestion); $del->bindValue(':id', $idQuestion, PDO::PARAM_INT); $del->execute(); echo 'Вопрос удалён'; } else { echo 'Ошибка удаления'; } } PHP: <table> <tr> <td>Вопрос</td> <td>Ответ</td> <td>Автор</td> <td>Действие</td> </tr> <?php foreach($list as $tr) { echo '<tr> <td>'.$tr['name'].'</td> <td>'.$tr['answer'].'</td> <td>'.$tr['user_name'].'</td> <td> <form method="POST"> <input type="hidden" name="id-user-question" value="'.$tr['question_id'].'"> <input type="hidden" name="id-user" value="'.$tr['user_id'].'"> <input type="hidden" name="login" value="'.$tr['user_name'].'"> <input type="submit" name="del-user-question" value="Удалить"> </form> </td> </tr>'; } ?> </table> --- Добавлено --- Скрин базы