Все для DataLife Engine / DLE хаки / Хак для DLE / Хак убираем доступность к файлам в закрытых разделах

Хак убираем доступность к файлам в закрытых разделах


В (DLE) DataLife Engine есть лазейка, которая позволяет скачивать файлы из новости, даже если ссылка скачивания находится в скрытом разделе. Если у вас есть VIP-раздел, то любой может выкачивать файлы, даже не обладая VIP-доступом. А возможно такой вариант, веб-мастер установит ссылку на своем ресурсе с вашей базы данных, тем самым все с другого ресурса у вас будут скачивать, что для вас не очень хорошо, так как будет дополнительная нагрузка на сервер.

Ну, а если у вас интернет дома с хорошей пропускаемой способностью и самым дешевым пакетом. Вы установили компьютер, как сервер, то за большой объем трафика, даже в этом случаи придется заплатить не устойку. В системе движка существует так же возможность подключения Блокировать скачивание файлов с других серверов , но она так же не эффективна работает.

Что же, давайте рассмотрим защиту, хак для dle убираем доступность к файлам в закрытых разделах, которая не дает свободно скачать файл по прямой ссылке
/engine/download.php?id=123


Преграда №1.
Настройки групп пользователей. Устанавливаем возможность скачивание файлов только для зарегистрированных пользователей. Остальные, то есть гости получат ошибку "Access denied".

Преграда №2.
Защита от не продвинутого пользователя, не лучший вариант, проверяется реферер, т.е. файл будет доступен для закачки только в том случае, если человек кликнул по ссылке. Но ничего не мешает самому исправить код странички и вставить туда ссылок с любым ID.

А теперь вспомним еще о 2х параметрах, которые также следовало бы учесть:
Параметр №1.
При добавлении новости, в закладке "доступ" можно определенной группе выставить уровень доступа "запретить просмотр". Но если в новости находится ценный файл который доступен только перечисленным группам, то злоумышленник все равно сможет получить доступ к файлу простым перебором.

Параметр №2.
В настройках групп пользователей в параметре "Доступные разделы" можно перечислить список категорий к которым будет открыт доступ. Получается та же ситуация. Простым методом перебора ID файлов можно будет скачать любой файл, даже не имея доступа в закрытый раздел.

А вот вариант решения с помощью изменения кода движка:
Открыть файл engine/download.php
Найти строку:
    $row = $db->super_query ( "SELECT name, onserver FROM " . PREFIX . "_files WHERE id ='$id'" );


Заменить на (Для DLE 9.6 и старше):
   $row = $db->super_query ( "SELECT name, onserver, access, category FROM " . PREFIX . "_files f LEFT JOIN ".PREFIX."_post_extras e ON e.news_id=f.news_id LEFT JOIN ".PREFIX."_post p ON f.news_id=p.id WHERE f.id ='$id'" );

if($row['access']){
    $row['access'] = explode(",",$row['access']);
    if(!in_array($member_id['user_group'],$row['access'])) die("Access denied");
}
if($user_group[$member_id['user_group']]['allow_cats'] AND $user_group[$member_id['user_group']]['allow_cats']!='all'){
    $allow_cats = explode(",",$user_group[$member_id['user_group']]['allow_cats']);
    $deny = true;
    if(strpos($row['category'],",")!==false){
        $row['category'] = explode(",",$row['category']);
        foreach($row['category'] as $cat) if(in_array($cat,$allow_cats)) $deny = false;
    }else{
        $row['category'] = intval($row['category']);
        if(in_array($row['category'],$allow_cats)) $deny = false;
    }
    if($deny) die("Access denied!");
}

Для младших версий DLE вставить:
    $row = $db->super_query ( "SELECT name, onserver, access, category FROM " . PREFIX . "_files f LEFT JOIN ".PREFIX."_post p ON f.news_id=p.id WHERE f.id ='$id'" );

if($row['access']){
    $row['access'] = explode(",",$row['access']);
    if(!in_array($member_id['user_group'],$row['access'])) die("Access denied");
}
if($user_group[$member_id['user_group']]['allow_cats'] AND $user_group[$member_id['user_group']]['allow_cats']!='all'){
    $allow_cats = explode(",",$user_group[$member_id['user_group']]['allow_cats']);
    $deny = true;
    if(strpos($row['category'],",")!==false){
        $row['category'] = explode(",",$row['category']);
        foreach($row['category'] as $cat) if(in_array($cat,$allow_cats)) $deny = false;
    }else{
        $row['category'] = intval($row['category']);
        if(in_array($row['category'],$allow_cats)) $deny = false;
    }
    if($deny) die("Access denied!");
}

Оф. портал: sandev pro

С уважением,
Олег Александрович a.k.a. Sander

Оф. ответ разработчика: "Никакой лазейки, здесь нет, потому как кому разрешено скачивать файлы с сервера, а кому нет, настраивается в настройках групп, в настройке которая отвечает именно за скачивание. И разрешение на просмотр новости или ее отсутствие в данном случае роли никакой не играет."

Да ну?
Ок, рассмотрим ситуацию на примере.
Есть у меня группы "Посетители" которым разрешено скачивание. И есть группа "VIP" которым также разрешено скачивание.
Но вот есть у меня раздел VIP, в котором я выкладываю модули и хаки, которые могут скачивать только пользователи из группы VIP.
Но как и сказал целсофт:
разрешение на просмотр новости или ее отсутствие в данном случае роли никакой не играет.

Получается, что простым подбором ID файла - любой посетитель может скачать файл из закрытого раздела даже не имея доступа в саму новость.

Все правильно. Я об этом и писал в "Преграда №1". Но настройка слишком критична, либо можно все либо ничего.

И если даже вида
download.php?id=1953


Все равно ничего не выйдет.

И да. Еще раз, для "особых". Этого:

Нужно научится шарить даже в примитивных целсофтовских алгоритмах. А не страдать херней.

Привожу строку из download.php
$id = intval ( $_REQUEST['id'] );


Т.е. для скачивания файла можно передавать только (!) id файла в числовом виде.
Все равно ничего не выйдет.
Другие хаки для dle, как хак убираем доступность к файлам в закрытых разделах
Весомый и главное аргумент

Dostupnost-faylov-v-zakrytyh-razdelah.rar [10,99 Kb] (cкачиваний: 91)
  • 60
Добавить комментарий

Оставить комментарий

    • bowtiesmilelaughingblushsmileyrelaxedsmirk
      heart_eyeskissing_heartkissing_closed_eyesflushedrelievedsatisfiedgrin
      winkstuck_out_tongue_winking_eyestuck_out_tongue_closed_eyesgrinningkissingstuck_out_tonguesleeping
      worriedfrowninganguishedopen_mouthgrimacingconfusedhushed
      expressionlessunamusedsweat_smilesweatdisappointed_relievedwearypensive
      disappointedconfoundedfearfulcold_sweatperseverecrysob
      joyastonishedscreamtired_faceangryragetriumph
      sleepyyummasksunglassesdizzy_faceimpsmiling_imp
      neutral_faceno_mouthinnocent