ANTISPAM: User ID not valid (DLE Внимание, обнаружена ошибка)

DLE


Проблема

Бывает что выскакивает ошибка при добавлении новостей на движке CMS DLE. Причин может быть несколько, наиболее распространенная из них является когда при открытой форме добавления новостей вы еще параллельно открываете вкладку со страницой сайта. В этом случае ДЛЕ думает что вы используете спам программу для массовой рассылки новостей или комментариев.

Что же делать в этом случае?


Я не знаю как в других браузерах, но в опере нужно вернуться назад, нажав на стрелку возврата и новость останется в неизменном виде.

Решение проблемы

Открыть админпанель в новой вкладке и выбрать раздел Настройка системы.
Дальше вторая иконка сверху > Настройка скрипта безопасности.
Найти пункт «Включить автоматическое блокирование спам программ» и напротив поставить «нет».
Сохраняем и добавляем новость, все должно получиться.

Рабочий конфиг для DLE 9.3 под Nginx или переписаная портянка реврайтов.

По работе, периодически приходиться заниматься переносом уже работающих ресурсов с веб сервера Apache на связку nginx — fastcgi, или со старого сервера на новый с уже установленным веб сервером nginx. Ни в коем разе не допускаю мысли, что Apache плохой веб сервер, учитывая количество модулей, он очень универсален, можно решать практически любые задачи, но его монстрообразность предъявляет определенные требования к ресурсам системы.

Когда речь идет о VPS серверах, мы как раз имеем дело с жестко ограниченными ресурсами и работающий в системе apache уж никак их не экономит, ограничение его аппетитов и выкидывание неиспользуемых модулей, зачастую не является решением проблемы. Доходит иногда до того, что из-за нехватки ресурсов, сам процесс удаленного администрирования сервера через SSH, становится просто мучением, про работу сайтов вообще молчу. Nginx-же в силу своей архитектуры и мизерного потребления ресурсов наоборот, незаменим там, где высокие нагрузки. Поэтому первым шагом по оптимизации VPS серверов, как правило является установка Nginx — php-fastcgi ( естественно это не панацея, и дело не всегда в apache и его аппетитах ).

DLE — достаточно распространенный сайтовый движок, уверен у него масса достоинств и плюшек, но с точки зрения администратора, куда больше впечатляет выдающаяся портянка RewriteRule в файле .htaccess, идущим в поставке движка.
Поскольку nginx, в принципе, не поддерживает обработку файлов .htaccess, все эти правила приходится портировать в конфиг сервера Nginx, естественно с учетом его особенностей и синтаксиса.

В общем приведу основную часть рабочего конфига:

server {
    listen       IP_ADDR:80;
    server_name HOST;

    root /path/to/root;

    rewrite ^/page/(.*)$ /index.php?cstart=$1 last;

    location / {
        rewrite "^/([0-9]{4})/([0-9]{2})/([0-9]{2})(/?)+$" /index.php?year=$1&month=$2&day=$3 last;
        rewrite "^/([0-9]{4})/([0-9]{2})/([0-9]{2})/page/([0-9]+)(/?)+$" /index.php?year=$1&month=$2&day=$3&cstart=$4 last;
        rewrite "^/([0-9]{4})/([0-9]{2})(/?)+$" /index.php?year=$1&month=$2 last;
        rewrite "^/([0-9]{4})/([0-9]{2})/page/([0-9]+)(/?)+$" /index.php?year=$1&month=$2&cstart=$3 last;
        rewrite "^/([0-9]{4})(/?)+$" /index.php?year=$1 last;
        rewrite "^/([0-9]{4})/page/([0-9]+)(/?)+$" /index.php?year=$1&cstart=$2 last;
        rewrite "^/([^.]+)(/?)+$" /index.php?do=cat&category=$1 last;
        rewrite "^/([^.]+)/page/([0-9]+)(/?)+$" /index.php?do=cat&category=$1&cstart=$2 last;
        index  index.php index.html index.htm;
    }

    location /tags/ {
        rewrite ^/tags/([^/]*)(/?)+$ /index.php?do=tags&tag=$1 last;
        rewrite ^/tags/([^/]*)/page/([0-9]+)(/?)+$ /index.php?do=tags&tag=$1&cstart=$2 last;
    }

    location /user/ {
        rewrite ^/user/([^/]*)/rss.xml$ /engine/rss.php?subaction=allnews&user=$1 last;
        rewrite ^/user/([^/]*)(/?)+$ /index.php?subaction=userinfo&user=$1 last;
        rewrite ^/user/([^/]*)/page/([0-9]+)(/?)+$ /index.php?subaction=userinfo&user=$1&cstart=$2 last;
        rewrite ^/user/([^/]*)/news(/?)+$ /index.php?subaction=allnews&user=$1 last;
        rewrite ^/user/([^/]*)/news/page/([0-9]+)(/?)+$ /index.php?subaction=allnews&user=$1&cstart=$2 last;
        rewrite ^/user/([^/]*)/news/rss.xml(/?)+$ /engine/rss.php?subaction=allnews&user=$1 last;
    }

    location /lastnews/ {
        rewrite ^/lastnews/(/?)+$ index.php?do=lastnews last;
        rewrite ^/lastnews/page/([0-9]+)(/?)+$ /index.php?do=lastnews&cstart=$1 last;
    }

    location /catalog/ {
        rewrite ^/catalog/([^/]*)/rss.xml$ /engine/rss.php?catalog=$1 last;
        rewrite ^/catalog/([^/]*)(/?)+$ /index.php?catalog=$1 last;
        rewrite ^/catalog/([^/]*)/page/([0-9]+)(/?)+$ /index.php?catalog=$1&cstart=$2 last;
    }

    location /newposts {
        rewrite ^/newposts(/?)+$ /index.php?subaction=newposts last;
        rewrite ^/newposts/page/([0-9]+)(/?)+$ /index.php?subaction=newposts&cstart=$1 last;
    }

    location /favorites {
        rewrite ^/favorites(/?)+$ /index.php?do=favorites last;
        rewrite ^/favorites/page/([0-9]+)(/?)+$ /index.php?do=favorites&cstart=$1 last;
    }

    location ~ \.(html|xml) {
        rewrite "^/([0-9]{4})/([0-9]{2})/([0-9]{2})/page,([0-9]+),([0-9]+),(.*).html(/?)+$" /index.php?subaction=showfull&year=$1&month=$2&day=$3&news_page=$4&cstart=$5&news_name=$6 last;
        rewrite "^/([0-9]{4})/([0-9]{2})/([0-9]{2})/page,([0-9]+),(.*).html(/?)+$" /index.php?subaction=showfull&year=$1&month=$2&day=$3&news_page=$4&news_name=$5 last;
        rewrite "^/([0-9]{4})/([0-9]{2})/([0-9]{2})/print:page,([0-9]+),(.*).html(/?)+$" /engine/print.php?subaction=showfull&year=$1&month=$2&day=$3&news_page=$4&news_name=$5 last;
        rewrite "^/([0-9]{4})/([0-9]{2})/([0-9]{2})/(.*).html(/?)+$" /index.php?subaction=showfull&year=$1&month=$2&day=$3&news_name=$4 last;
        rewrite "^/([^.]+)/page,([0-9]+),([0-9]+),([0-9]+)-(.*).html(/?)+$" /index.php?newsid=$4&news_page=$2&cstart=$3 last;
        rewrite "^/([^.]+)/page,([0-9]+),([0-9]+)-(.*).html(/?)+$" /index.php?newsid=$3&news_page=$2 last;
        rewrite "^/([^.]+)/print:page,([0-9]+),([0-9]+)-(.*).html(/?)+$" /engine/print.php?news_page=$2&newsid=$3 last;
        rewrite "^/([^.]+)/([0-9]+)-(.*).html(/?)+$" /index.php?newsid=$2 last;
        rewrite "^/page,([0-9]+),([0-9]+),([0-9]+)-(.*).html(/?)+$" /index.php?newsid=$3&news_page=$1&cstart=$2 last;
        rewrite "^/page,([0-9]+),([0-9]+)-(.*).html(/?)+$" /index.php?newsid=$2&news_page=$1 last;
        rewrite "^/print:page,([0-9]+),([0-9]+)-(.*).html(/?)+$" /engine/print.php?news_page=$1&newsid=$2 last;
        rewrite "^/([0-9]+)-(.*).html(/?)+$" /index.php?newsid=$1 last;
        rewrite "^/static/(.*).html(/?)+$" /index.php?do=static&page=$1 last;
        rewrite ^/rules.html$ /index.php?do=rules last;
        rewrite ^/statistics.html$ /index.php?do=stats last;
        rewrite ^/addnews.html$ /index.php?do=addnews last;
        rewrite ^/([^.]+)/rss.xml$ /engine/rss.php?do=cat&category=$1 last;
        rewrite ^/page,([0-9]+),([^/]+).html$ /index.php?do=static&page=$2&news_page=$1 last;
        rewrite ^/print:([^/]+).html$ /engine/print.php?do=static&page=$1 last;
        rewrite ^/rss.xml$ /engine/rss.php last;
        rewrite ^/sitemap.xml$ /uploads/sitemap.xml last;
    }

    location ~* \.(jpg|jpeg|gif|png|ico|swf|css|js)$ {
        expires             30d;
        add_header          Cache-Control public;
    }

## Тут установлен дополнительный пароль на админку
    location =/admin.php {
        auth_basic            "closed section";
        auth_basic_user_file  htpasswd;
        fastcgi_pass   unix:/tmp/fastcgi.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    location ~ \.php$ {
        fastcgi_pass   unix:/tmp/fastcgi.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    location ~ /\.ht {
        deny  all;
    }
}


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

Неработает "последние новости" в DLE(NGINX)

Не так давно обнаружилось, что не работает ссылка на карту сайта, в связи с переходом на nginx, движок DLE. Что было исправлено дописывание в уже существующую строчку одного слова -last

Сегодня обнаружилась ещё одна проблема, не работали странички перехода по страницам в «последних новостях» в DLE
В своём конфиге site-avaible строчек указывающие на lastnews я вобще не обнаружил.
Решил проблему добавлением:
location /lastnews/ {
        rewrite ^/lastnews/(/?)+$ index.php?do=lastnews last;
        rewrite ^/lastnews/page/([0-9]+)(/?)+$ /index.php?do=lastnews&cstart=$1 last;
    }

После чего перезагрузил nginx и всё заработало.

Nginx не работает ссылка на sitemap (DLE)

DLE
После перевода движка DLE на nginx, пришлось отказаться от реврайтовских деревктив Apache. Написать аналог им для Nginx.

Но выяснилось, что ссылка на sitemap.xml так и не работала.

Для этого в nginx.conf
Заменить
rewrite ^/sitemap.xml$ uploads/sitemap.xml;

на
rewrite ^/sitemap.xml$ /uploads/sitemap.xml last;


Или просто добавить, если такой не было.

Запрет выполнения php в определённых директориях (nginx) или как защитить папки uploads в DLE(nginx)

Если ваш веб-сервер Apache, вы можете добавить следующие строки или файл .htaccess их уже имеет:

<Directory /website/attachments>
php_flag engine off
</Directory>


Чтобы отключить выполнение php в определённой директории на Nginx:
location /upload/ {
location ~ .*\.(php)?$
{
deny all;
}
}

Внимание: Если файл PHP находится в подкаталоге одного из этих каталогов, она все равно выполняет

Другой вариант запрета с перечислением каталогов и файлов:
location ~* ^/(upload|images)/.*\.(php|php5)$
{
deny all;
}


Если ваш веб-сервер lighthttpd вы можете сделать то же самое:

$HTTP["url"] =~ "^/(forumdata|templates|customavatars?)/" {
fastcgi.server = ()
}
Apache:
<Location "/forumdata">
php_admin_flag engine off
Options -ExecCGI
AddType text/plain .html .htm .shtml .php
</Location>

DLE и nginx

DLE
В nginx не работают реврайт, т.е .htaccess в nginx не будет работать, так как он отноится к Apache.
Выход: Для того, чтобы на DLE работали ЧПУ добавляем в nginx.conf вместо зачеркнутого(если подобных строчек нету в этом файле, ищите например бывает в /etc/nginx/sites-enabled/default)

location / {
root /home/allsoldhere;
index index.php index.html index.htm;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php last;
}

}

rewrite ^/page/(.*)$ /index.php?cstart=$1;

rewrite ^/([0-9]+)/([0-9]+)/([0-9]+)/page,([0-9]+),([0-9]+),(.*).html*$ /index.php?subaction=showfull&year=$1&month=$2&day=$3&news_page=$4&cstart=$5&news_name=$6;
rewrite ^/([0-9]+)/([0-9]+)/([0-9]+)/page,([0-9]+),(.*).html*$ /index.php?subaction=showfull&year=$1&month=$2&day=$3&news_page=$4&news_name=$5;
rewrite ^/([0-9]+)/([0-9]+)/([0-9]+)/print:page,([0-9]+),(.*).html*$ /engine/print.php?subaction=showfull&year=$1&month=$2&day=$3&news_page=$4&news_name=$5;
rewrite ^/([0-9]+)/([0-9]+)/([0-9]+)/(.*).html*$ /index.php?subaction=showfull&year=$1&month=$2&day=$3&news_name=$4;

rewrite ^/([^.]+)/page,([0-9]+),([0-9]+),([0-9]+)-(.*).html(/?)$ /index.php?newsid=$4&news_page=$2&cstart=$3;
rewrite ^/([^.]+)/page,([0-9]+),([0-9]+)-(.*).html(/?)$ /index.php?newsid=$3&news_page=$2;
rewrite ^/([^.]+)/print:page,([0-9]+),([0-9]+)-(.*).html(/?)$ /engine/print.php?news_page=$2&newsid=$3;
rewrite ^/([^.]+)/([0-9]+)-(.*).html(/?)$ /index.php?newsid=$2;

rewrite ^/page,([0-9]+),([0-9]+),([0-9]+)-(.*).html(/?)+$ /index.php?newsid=$3&news_page=$1&cstart=$2;
rewrite ^/page,([0-9]+),([0-9]+)-(.*).html(/?)+$ /index.php?newsid=$2&news_page=$1;
rewrite ^/print:page,([0-9]+),([0-9]+)-(.*).html(/?)+$ /engine/print.php?news_page=$1&newsid=$2;
rewrite ^/([0-9]+)-(.*).html(/?)+$ /index.php?newsid=$1;

rewrite ^/([0-9]+)/([0-9]+)/([0-9]+)/page/([0-9]+)(.*)$ /index.php?year=$1&month=$2&day=$3&cstart=$4;
rewrite ^/([0-9]+)/([0-9]+)/([0-9]+)(.*)$ /index.php?year=$1&month=$2&day=$3;

rewrite ^/([0-9]+)/([0-9]+)/page/([0-9]+)(.*)$ /index.php?year=$1&month=$2&cstart=$3;
rewrite ^/([0-9]+)/([0-9]+)(.*)$ /index.php?year=$1&month=$2;

rewrite ^/([0-9]+)/page/([0-9]+)(.*)$ /index.php?year=$1&cstart=$2;
rewrite ^/([0-9]+)(.*)$ /index.php?year=$1;

rewrite ^/catalog/([^/]*)/page/([0-9]+)(.*)$ /index.php?catalog=$1&cstart=$2;
rewrite ^/catalog/([^/]*)(.*)$ /index.php?catalog=$1;

rewrite ^/newposts/page/([0-9]+)(.*)$ /index.php?subaction=newposts&cstart=$1;
rewrite ^/newposts(.*)$ /index.php?subaction=newposts;

rewrite ^/static/(.*).html(.*)$ /index.php?do=static&page=$1;

rewrite ^/user/([^/]*)/news/page/([0-9]+)(.*)$ /index.php?subaction=allnews&user=$1&cstart=$2;
rewrite ^/user/([^/]*)/news(.*)$ /index.php?subaction=allnews&user=$1;
rewrite ^/user/([^/]*)(.*)$ /index.php?subaction=userinfo&user=$1;
rewrite ^/favorites /index.php?do=favorites;
rewrite ^/favorites/page/(.*)$ /index.php?do=favorites&cstart=$1;
rewrite ^/statistics.html$ /index.php?do=stats;
rewrite ^/addnews.html(.*)$ /index.php?do=addnews;
rewrite ^/rss.xml$ /engine/rss.php;
rewrite ^/sitemap.xml$ uploads/sitemap.xml;
if (!-d $request_filename) {
rewrite ^/([^.]+)/page/([0-9]+)(.*)$ /index.php?do=cat&category=$1&cstart=$2;
rewrite ^/([^.]+)/*$ /index.php?do=cat&category=$1;       
}
if (!-f $request_filename) {
rewrite ^/([^<]+)/rss.xml$ /engine/rss.php?do=cat&category=$1;
rewrite ^/page,([0-9]+),([^/]+).html$ /index.php?do=static&page=$2&news_page=$1;
rewrite ^/([^/]+).html$ /index.php?do=static&page=$1;
}

Как сделать статическую страницу главной в DLE?

DLE
Нет ничего проще =)

Создаешь статическую страницу, записываешь её адрес, например: page_static1.html
Редактируешь файл .htaccess в корне, и в самом верху
DirectoryIndex index.php?do=static&page=page_static1


Если же в файле нет такой строки, она обычно первая, то просто добавь её, и все.

DLE: Количество выводимых тегов для {tags}

DLE
Меняем количество тэгов выводимых в {tags}

Идём в:
engine/modules/tagscloud.php

находим строчку:
$db->query("SELECT SQL_CALC_FOUND_ROWS tag, COUNT(*) AS count FROM " . PREFIX . "_tags GROUP BY tag ORDER BY count DESC LIMIT 0,40");

и вместо 40 ставим нужно число! :-)

вот и всё!

Защита папок скрипта от запуска сторонних скриптов

DLE
Дорогие друзья,

в этой небольшой статье мы хотим рассказать вам о том как, как вам можно повысить безопасность вашего сайта. Как известно наибольшую угрозу для сайта представляют собой залитые злоумышленником на сервер PHP шеллы. Что это такое? Это PHP скрипты которые могут выполняться на вашем сервере, соответственно производить какие-либо изменения в файлах доступных для записи или могут, например читать содержимое конфигурационных данных и соответственно получать прямой доступ к базе данных. Каким образом могут попадать данные шеллы на ваш сервер? При обнаружении какой либо уязвимости в скрипте, или сторонних модулях, или вообще при наличии других уязвимых сторонних скриптов на сервере, или серверного ПО. Главная особенность заключается в том, что шеллы можно залить не в любые папки на сервере, а лишь в папки доступные для записи на сервере, и в DataLife Engine такими папками являются папки /uploads/ и /templates/, а также все вложенные в них папки. Данные папки должны иметь права на запись, т.к. вы в них заливаете посредством скрипта легальный контент, файлы, картинки, редактируете в админпанели шаблоны и прочее. И как правило в эти папки производится загрузка шеллов при обнаружении злоумышленником какой либо бреши на сервере в любом скрипте, даже не имеющем отношения к DataLife Engine. Можно ли защитить эти папки, в случае попадания в них зловредного PHP файла, ведь нельзя запретить доступ к этим папкам? Можно, и достаточно не сложно.

Итак, вам необходимо разместить в папках /uploads/ и /templates/ файл .htaccess со следующим содержимым:
php_flag engine  off


Данная строчка отключает использование PHP интерпретатора при попытке обращения к PHP файлам находящимся в этих папках, а также находящимся во всех вложенных папках. Поэтому даже в случае заливки в эти папки файлов со зловредным PHP кодом, они становятся для злоумышленника совершенно бесполезными, т.к. попросту не будут запускаться и выполнятся сервером.

К сожалению далеко не все хостинг провайдеры позволяют управлять через .htaccess данным параметром, но для таких сайтов решение также существует, поэтому если на вашем сервере не работает вышеуказанный способ, то разместите в этих же папках .htaccess с содержимым:
<FilesMatch "\.([Pp][Hh][Pp]|[Cc][Gg][Ii]|[Pp][Ll]|[Ph][Hh][Tt][Mm][Ll])\.?.*">
   Order allow,deny
   Deny from all
</FilesMatch>


Данный код запрещает прямое обращение к PHP файлам, находящимся в этих папках.

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

Но если им удастся получить доступ к вашей админ панели, и они попытается разрешить заливку php скриптов.
Для подстраховки можно сделать так.
Открыть: engine/inc/files.php и найти там

$allowed_extensions = array ("gif", "jpg", "png", "jpe", "jpeg" );
$allowed_video = array ("avi", "mp4", "wmv", "mpg", "flv", "mp3", "swf", "m4v", "m4a", "mov", "3gp", "f4v" );
$allowed_files = explode( ',', strtolower( $config['files_type'] ) );
$img_result_th = "";
$img_result = "";


Найденное заменяем на:

$allowed_extensions = array ("gif", "jpg", "png", "jpe", "jpeg" );
$allowed_video = array ("avi", "mp4", "wmv", "mpg", "flv", "mp3", "swf", "m4v", "m4a", "mov", "3gp", "f4v" );
$allow_conf = str_replace("php",md5(time() - rand(30,60)),strtolower( $config['files_type'] ));
$allowed_files = explode( ',', $allow_conf );
$img_result_th = "";
$img_result = "";


После этого вы очень сильно усложните заливку шелла на сайт, и сможете наконец спать спокойно!