Плагин защиты от POST взлома

Увидел тут на форуме, что бывает засыпают POST-запросами.
А что если создать плагин, который бы добавлял к каждой форме скрытое поле и при получении modx'ом, проверял его валидность? Если поле не верное, либо прилетело откуда-то :), то die()?
Набросал, проверил, работает, код плагина под катом.

Ниже плагин TokenPostProtect, события OnWebPagePrerender (пусть будет в конце выполнения плагинов).
Это лишь как пример. Для AJAX надо самому добавлять, можно например придумать что-то вроде замены например #PROTECT# на ?$ProtectFieldName=bin2hex…
bin2hex и hex2bin можно заменить на свои функции… в общем я думаю я идею выразил.
Кто что думает?

if(!defined('MODX_BASE_PATH')){die('What are you doing? Get out of here!');}
$useridP=$modx->getLoginUserID();
$ProtectFieldName='tokenprotect';
$protect["REMOTE_PORT"]=$_SERVER["REMOTE_PORT"];
$protect["ip"]=$_SESSION['ip'];
$keyP="k".$useridP.$_SESSION['ip'];
$e = &$modx->Event;

switch ($e->name) {
case "OnWebPagePrerender":
$Pv=bin2hex(serialize($protect));
$o = &$modx->documentOutput; // get a reference of the output
$o = str_replace("</form>","<input id='$ProtectFieldName' name='$ProtectFieldName' type='hidden' value='$Pv'></form>",$o);	
$modx->documentOutput=$o;
break;
case "OnWebPageInit":
if (count($_POST)>0){
if ($_POST[$ProtectFieldName]!=""){
$Pr=unserialize(hex2bin($_POST[$ProtectFieldName]));
//Если массивы равны
if ($Pr===$protect){
return;	 
}	 
}
// echo "What are you doing ".$_SESSION['ip']."? Get out of here!";
header('HTTP/1.1 500 Internal Server Error');
}
default:
return;
break;
}

18 комментариев

avatar
Припоздали вы топиком, это давно существующее решение. А в сборке у Димы так вообще уже встроенное.
avatar
а причём тут eForm?! я про любую форму речь виду, а точнее про любой пришедший $_POST.
Комментарий отредактирован 2016-12-24 09:27:09 пользователем zabudkin
avatar
Что б не вырезало теги используйте тег Кода ) будет гараздо приятней визуально и ничего не порежет ) а то сейчас ничего не скопируешь :)
кста решение для всех Форм тоже есть т Bumkaka )
avatar
Идея дельная
вы предлагаете что-то вроде csrf token
правда, я бы реализовал это несколько по-другому :)
avatar
Идея хорошая.
avatar
Главное что работающая, но я уже другое написал :)
лень оформлять…
avatar
я думаю что это имеет отношение к защите от спама но не к защите от взлома.
эти строки в .htaccess
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
говорят нам, что любой запрос направленный к существующему файлу не будет направлен через index.php и соответственно никакие плагины не сработают, и защита соответственно тоже, а взлом через тот же, к примеру, PHPMailer как раз таки производится путем прямого обращения к php файлам. Или я не прав?
avatar
Суть в том, что Вы до сих пор пользуетесь apache :) (стати вертолёт так себе, «ниочём»), а почему не nginx+php-fpm? ;)

Да и с какого х… у Вас файлы такие существуют?

Да в том же apache и другом, короче при вызове php:
if(!defined('MODX_BASE_PATH')){die('What are you doing? Get out of here!');}

какой взлом?
Комментарий отредактирован 2017-01-26 04:41:57 пользователем zabudkin
avatar
не важно чем польузюсь я, важно чем пользуются клиенты.
во многих файлах идущих в сборке нет строки
if(!defined('MODX_BASE_PATH')){die('What are you doing? Get out of here!');}

например те же файлы PHPMailer или TinyMCE.
avatar
:))))))))))))))))))
аж подбородок упал )))))

EVO официально не поддерживается, есть community.
Никаких обязательств.
Я думаю EVO пользуются люди, кто хоть как-то знает PHP…
что мешает ВАМ ЛИЧНО добавить строку в начало?!
avatar
Мешают моральные принципы, мешает убеждение в том, что такой подход к делу не верен, так как нельзя быть уверенным что в каждом файле есть такая строка, мешает то, что правки внесенные в основную поставку сборки затрутся при обновлении.
Сайтами и системами управления пользуются пользователи, менеджеры, владельцы бизнеса, домохозяйки… и еще много категорий людей не знающих PHP, и даже разработку на MODX некоторые ведут не зная PHP, это вполне реально.
avatar
Я говорю О КОДЕ, а Вы о выводе кода.
Ну добавьте дополнительную проверку, по группе например, это просто, но я Вам лично примера не дам, такие как Вы, зарабатывающие на «юзерах», не заслуживаете помощи.

Создайте плагин, любой, и добавьте туда эту строчку, посмотрите чтобы он был самым первым в вызове и будет Вам счастье.
Комментарий отредактирован 2017-01-26 07:47:09 пользователем zabudkin
avatar
я не просил никакой помощи в данном случае.
мне что сейчас по-вашему уволиться с работы?
я хотел уточнить приницип работы и назначение плагина так как мне показалось что он не совсем соответствует заголовку.
avatar
Плагин работает, проверьте сами, создайте, откройте страницу с формой, посмотрите исходный код страницы, в конце формы перед /form будет вставлен токен. И если форма потом засабмиттится и токен будет не тот (либо его не будет вовсе), то будет ошибка 500.
Комментарий отредактирован 2017-01-26 08:18:15 пользователем zabudkin
avatar
нисколько в этом не сомневаюсь, видимо просто мы несколько по разному оцениваем понятие «взлом»
avatar
Вам что-то мешает сделать доступ в htaccess только для нужных людей или что?
Скажите, прошу Вас, чтобы я мог хотя бы увидеть проблему. (как в соседней теме писал @dmi3yy, что типа оформляли бы).
avatar
какую проблему? я не говорил ни о каких проблемах.
не буду повторять вопрос, так как я написал его в первом сообщении.
avatar
Ну так и получили ответ!

Тема закрыта.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.