дырявая авторизация пропускает запрос

B
На сайте с 14.04.2012
Offline
35
742

<?php


if (isset($_POST['auth_name'])) {
$name=mysql_real_escape_string($_POST['auth_name']);
$pass=mysql_real_escape_string($_POST['auth_pass']);
$query = "SELECT * FROM users WHERE user_login='$name' AND user_password ='$pass'";
$res = mysql_query($query) or trigger_error(mysql_error().$query);
if ($row = mysql_fetch_assoc($res)) {
session_start();
$_SESSION['user_id'] = $row['user_id'];
$_SESSION['user_ip'] = $_SERVER['REMOTE_ADDR'];
}
header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
exit;
}
if (isset($_GET['action']) AND ($_GET['action']=="logout")) {
session_start();
session_destroy();
header("Location: http://".$_SERVER['HTTP_HOST']."/");
exit;
}
if (isset($_REQUEST[session_name()])) session_start();
if (isset($_SESSION['user_id']) AND $_SESSION['user_ip'] == $_SERVER['REMOTE_ADDR']) return;
else {
?>
<form method="POST">
<input type="text" name="auth_name"><br>
<input type="password" name="auth_pass"><br>
<input type="submit"><br>
</form>
<?
}
exit;
?>

Имеется такой вот файл авторизации.

На страницы, доступ к которым хотим ограничить вписываем require "auth.php";

Все работает,но есть одна проблема. Имеется у меня такой файл как delete_post.php с таким содержанием

<?php 

require "system/config.php";
$delete_post=$_GET['id'];

$result = mysql_query("DELETE FROM post WHERE id='$delete_post'", $db);

require "auth.php";
?>

Ссылка на удаление получается вида delete_post.php?id=2, то есть рабоатет по id новости.

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

KV
На сайте с 22.12.2011
Offline
88
#1

<?php 


require "system/config.php";
require "auth.php";

$delete_post=$_GET['id'];

$result = mysql_query("DELETE FROM post WHERE id='$delete_post'", $db);

?>

не?

а, возможно,

require "auth.php";

здесь не требуется?

стартануть сессию (если это не происходит где-то раньше)

и сделать

if (isset($_SESSION['user_id']) {


$delete_post=$_GET['id'];

$result = mysql_query("DELETE FROM post WHERE id='$delete_post'", $db);

}
Как бы на тебя ни давили, никогда не соглашайся на роль, что тебе не нравится *** http://handmade.tigress.com.ua
B
На сайте с 14.04.2012
Offline
35
#2

Да, сессией получилось и помещение require "auth.php"; до сроки запроса тоже вышло

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#3

т.е. любой залогененный может удалить любую, а так же все новости на сайте? :)

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
KV
На сайте с 22.12.2011
Offline
88
#4

Почему-то подумалось, что админ единственный, кто туда заходит :)

А так да, смотреть надо, кто там еще бывает. :)

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#5
K_V_S:
Почему-то подумалось, что админ единственный, кто туда заходит :)

А тогда не было бы проблем. Урл бы на удаление никто не знал :)

+

if (isset($_SESSION['user_id']) AND $_SESSION['user_ip'] == $_SERVER['REMOTE_ADDR']) return;

Явно не только для админа.

KV
На сайте с 22.12.2011
Offline
88
#6

Ну, возможно, где-то в базе и существует таблица с группами пользователей. :)

B
На сайте с 14.04.2012
Offline
35
#7

Да,была уязвимость. Даже не залогиненный мог удалить любую информацию, если бы он знал ссылки, подставив просто id на конце. Теперь все пофиксил, авторизацию полностью изменил

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий