Автор Тема: Вот такой вот сюрприз!  (Прочитано 807 раз)

18 Май 2015, 19:26:43
  • Фрилансер
  • *
  • Сообщений: 186
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Сперва хочу уточнить что все модули и шаблоны которые у меня есть оплачены и с лицензией.
Как бы я надеюсь что если у меня все с лицензией, то никаких сюрпризов не должно быть и я могу спать спокойно. Но последние 12 часов я не спал. А вот почему:
Сегодня ночью у меня пропала админка, пропала в смысле страница вобще не грузится (страница входа) и выдает ошибку 504.
При етом сам магазин работает нормально. Подумал что ето у меня комп борохлит и оставил все дела на утро. Но утром тоже самое, а тем временем начали приходить и заказы на почьту  >:( Решил попробовать и мой тестовый магазин, который почти полное копие рабочего. Удивился и одновременно обрадовался, так как и на тестовом не грузилась админка. А обрадовался потому что в тестовом давно не заходил и если он неработает значит дело не во мне!
Решил написать хостеру. Спасибо хостеру за помощь! Ребята из бегет написали мне вот ето:

Цитировать
Здравствуйте, проверьте сейчас открываемость (нужно дооолго ждать).
У вас при открытии админки CMS пытается подключиться к ...
14:37:19.364014 recvfrom(11, "2.10♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥\разработчик шаблона♥♥♥♥♥♥♥♥♥♥♥♥0\f♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥4♥♥♥♥k2{1", 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, [16]) = 47
14:37:19.364159 close(11)               = 0
14:37:19.364298 alarm(0)                = 300
14:37:19.364379 rt_sigaction(SIGALRM, {SIG_DFL, [], SA_RESTORER, 0x7fc2ea785150}, NULL, 8) = 0
14:37:19.364508 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 11
14:37:19.364603 fcntl(11, F_GETFL)      = 0x2 (flags O_RDWR)
14:37:19.364683 fcntl(11, F_SETFL, O_RDWR|O_NONBLOCK) = 0
14:37:19.364765 connect(11, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("xxx.xxx.xxx.xxx")}, 16) = -1 EINPROGRESS (Operation now in progress)
14:37:19.364916 poll([{fd=11, events=POLLOUT|POLLWRNORM}], 1, 1000) = 0 (Timeout)
14:37:20.368432 poll([{fd=11, events=POLLOUT|POLLWRNORM}], 1, 1000) = 0 (Timeout)
14:37:21.369617 poll([{fd=11, events=POLLOUT|POLLWRNORM}], 1, 1000) = 0 (Timeout)

.. стороннему сервису хххх.com (xxx.xxx.xxx.xxx), который не отвечает.
Вам необходимо обраиться к разработчику сайта для того, чтобы он отключил плагин, который подключается к сервису либо другим способом обошёл бы это

Тааак :( Ети красные надписи ИП адрес сайта разработчика моего шаблона. Если я хочу зайти в мою админку, мой сайт сперва пытается подключится к серверу моего разработчика и если моя админка не успевает ето сделать то тогда выдает ошибку 504. Более того: если увеличить время запроса со стороны хостера страница с логином все таки загружается через 1 минуту, но если ввести почьту и пароль магазин отвечает что такого потребителя нет или пароль неверный! Что я чувствувал пока пытался залезть в МОЮ админ панель и не успевал, а тем временем приходили заказы от клиентов мне трудно передать словами. Так же важно отметить что за все ето време сайт разработчика был недоступен. Я не мог написать самому разработчику!!!
К 13.00 сегодня сайт разработчика активировался - моя админка соответно тоже, и я им написал письмо где изложил всю ету историю не прилагая разговор с хостером. Они мне ответили что ето я себе фантазирую и ничего такого быть не может. Тогда я им послал и ответ хостера с просьбой прокоментировать ихний ответ, в етот раз они поменяли свое мнение и ответили: "Протестируем сегодня  и дам вам знать ".
Еще важный момент: когда ихний сайт заработал я успел войти в админку, но пока я был внутри ихний сайт опять упал. Я остался в админке, страницы загружались очень медлено, но все данные отсуствовали, все заказы, вся статистика и т.д.
Так вот ето конец разказа и я все еще очень сильно волнуюсь, потому что понятия не имею что ето за скрипт, что он делает и вобще почему я зависим от сайта моего разраба!
Прось к вам, к всем знатокам: скажите пожалуйста что по вашему мнению делает ета связь, зачем она вобще есть, может ето бекдор от разраба?
Если разработчик ничего не сделает, я сам могу ли запретить ету проверку и сам отвязатся от них?
Извините за плохой русский, я из Болгарии :)
18 Май 2015, 19:50:39
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 1808
  • Репутация: +49/-1
  • Сообщество PrestaShop
    • Просмотр профиля
Жесть. Обходить стороной нужно таких разработчиков. Это-же они все данные ваши получают. Никакая тема, модуль не должны соединитятся без вашего ведома с другим сайтом.
Напишите адрес этого "разработчика", в то так можно не слабо попасть. Вас взломали, а вы еще и заплатили за это. 
18 Май 2015, 19:55:15
Ответ #2
  • Фрилансер
  • *
  • Сообщений: 186
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Пока подожду последний ихний ответ. И если он меня не устроит то тогда наверно напишу.
Вы думаете что ето 100% бекдор?!
Извините за плохой русский, я из Болгарии :)
18 Май 2015, 20:19:00
Ответ #3
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Это 100% не корректное отношение к заказчику. Если разработчик не предупреждал о таком, то он не имеет права внедрять скрипт, который что-то делает на вашем сайте. Можно сказать, что это бекдор. Вас не предупредили, а данные с сайта получали, т.е. был доступ к чужим данным. А что он там делали с вашими данными никто не знает.
С таким разработчиками не нужно ждать, сразу писать и выкладывать о них все данные. Через пару дней они все подчистят и вас же и обвинят.
18 Май 2015, 20:35:40
Ответ #4
  • Фрилансер
  • *
  • Сообщений: 186
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Кто нибудь может помочь залатать дыру? За оплату конечно.

UPD: если честно я все еще не могу поверить что разработчик злоупотребил, так как их команда и ихние продукты выглядят весьма сериозно....
Извините за плохой русский, я из Болгарии :)
19 Май 2015, 08:51:36
Ответ #5
  • Фрилансер
  • *
  • Сообщений: 186
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Еще два вопроса:

1. Можно ли симулировать то что произошло вчера? Как можно запретить весь исходящий трафик к вопросному IP адресу?
2. По описанию происходящего, которое я написал в начале етой темы, можете ли подксазать хотя бы приблизително в каких файлах порытся что бы найти вопросное подключение?

Спасибо!
Извините за плохой русский, я из Болгарии :)
19 Май 2015, 09:30:16
Ответ #6
  • Ветеран
  • *****
  • Сообщений: 1808
  • Репутация: +49/-1
  • Сообщество PrestaShop
    • Просмотр профиля
1. Можно через настройку netfilter/iptable.
2. Код смотреть нужно. Это просто вычислить, поставить тему на тестовом сервере и фильтровать весь исходящий трафик, плюс процессы.
Но на рабочем сайте такого лучше не делать.
19 Май 2015, 09:53:26
Ответ #7
  • Фрилансер
  • *
  • Сообщений: 186
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Пришел ответ от разработчика:
Цитировать
Я  думаю мы нашли причину которая могла повлиять на ваш хостинг . Пожалуйста обновите этот файл  modules/хххххххх/notifications.php



Везде где крестики ето имя ихней компании или УРЛ ихнего сайта

Вот содержание файла перед тем как обновить:

<?php 
class 
Notifications{

const CONFIG_LICENSE_PATH "TC_CODE";
const VERIFY_URL "http://xxxxxxxxxxxxxxxxx.php";
const FEED_URL "http://xxxxxxxxxxxxxxxxxxxxxxxx.php";
const UPDATE_FREQUENCY 0.1;

private $_code;
private $_type;

public function __construct($type false)
{
if ($type != false)
$this->_type $type;
}


public function verify(){
if (!$this->checkConfigData())
return;
$this->checkRemote();
}

public function getLines(){
if (!$this->checkConfigData())
return;
$this->checkRemote();
return $this->getLastPrestaNotification();
}

public function checkConfigData(){
$this->_code Configuration::get(self::CONFIG_LICENSE_PATH);
return ($this->_code == '')?false:true;
}

private function checkRemote(){




if (!$this->getLicense()){
$_url self::VERIFY_URL '?server=' urlencode(__PS_BASE_URI__) . '&code=' Configuration::get(self::CONFIG_LICENSE_PATH);
$response $this->sendRemoteRequest($_url);

if ($response == "success"){
$this->setLicense();
}else{
$this->unsetLicense();
}
}else{
$this->addNotification();
}

}

private function sendRemoteRequest($url){  
$ch curl_init(); 
curl_setopt($chCURLOPT_URL$url); 
curl_setopt($chCURLOPT_HEADERfalse); 
curl_setopt($chCURLOPT_NOBODYfalse); 
curl_setopt($chCURLOPT_RETURNTRANSFERTRUE); 
$body curl_exec($ch); 
$httpCode curl_getinfo($chCURLINFO_HTTP_CODE); 
curl_close($ch); 
return $body;
}

private function addNotification(){

if ($this->checkLastUpdate()){
$addNotifyArray = array();
foreach($this->getNotifications() as $_notify){
$notifications $this->getPrestaNotifications($_notify['title']);

if (empty($notifications)){
$addNotifyArray[] = $_notify;
}
}
if (!empty($addNotifyArray)){
               $this->writeNotify($addNotifyArray);
}


}
}

private function setLicense(){
$context Context::getContext();
$context->cookie->__set('xxxxxxxxx_tc_license',md5(time())); 
Configuration::updateValue('TC_LICENSE_CHECKED',true);
}

private function unsetLicense(){
$context Context::getContext();
$context->cookie->__set('xxxxxxxxx_tc_license',false); 
Configuration::updateValue('TC_LICENSE_CHECKED',false);
}


private function checkLastUpdate(){

$context Context::getContext();
if ($this->getLastUpdate() < (time() - self::UPDATE_FREQUENCY*60)){
$context->cookie->__set('xxxxxxxxx_tc_lastcheck',time() ); 
return true;
}
return false;
}

public function getLastUpdate()
    {
        $context Context::getContext();     
    if ($context->cookie->xxxxxxxxx_tc_lastcheck)
     return $context->cookie->xxxxxxxxx_tc_lastcheck;
    return false;
    }
    
    private function getLicense(){
     $context Context::getContext();     
    if ($context->cookie->xxxxxxxxx_tc_license)
     return $context->cookie->xxxxxxxxx_tc_license;
    return false;
    }
    
    
    private function getNotifications(){
     $_url self::FEED_URL '?server=' urlencode(__PS_BASE_URI__) . '&code=' Configuration::get(self::CONFIG_LICENSE_PATH) . '&product=' $this->_type;
    
     $this->_feedUrl $_url;
        $feedData = array();
        
        $feedXml $this->getFeedData();
                 
        if ($feedXml && $feedXml->channel && $feedXml->channel->item) {
            foreach ($feedXml->channel->item as $item) {                
                $feedData[] = array(
                        'severity' => 3,
                        'date_added' => gmdate('Y-m-d H:i:s',time()),
                        'title' => (string) $item->title,
                        'description' => (string) $item->description,
                        'url' => (string) $item->link,
                );
            }           
            
        }
        
        return $feedData;
    
    }
    
    public function getPrestaNotifications($title){
    $query '
SELECT s.*
FROM `'
._DB_PREFIX_.'notifications` s
WHERE s.`title` = "'
.$title.'"';

return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($query);
    }
    
    public function getLastPrestaNotification(){
    $row Db::getInstance()->getRow('
SELECT s.*
FROM `'
._DB_PREFIX_.'notifications` s
WHERE readed = 0
ORDER BY s.id DESC'
);
if (isset($row['title']))
return $row;
return array();
    }
    
    
    
    public function getFeedData(){
        $data $this->sendRemoteRequest($this->_feedUrl);
        
//         $data = preg_split('/^\r?$/m', $data, 2);
//         if (isset($data[0]))
        $data trim($data);

        try {
            $xml  = new SimpleXMLElement($data);
        }
        catch (Exception $e) {

            return false;
        }
        
        return $xml;
    }
    
    public function writeNotify($_data){
     foreach($_data as $item){
$query 'INSERT INTO `'._DB_PREFIX_.'notifications` VALUES (null,"'.$item['title'].'","'.htmlspecialchars($item['description']).'","'.$item['url'].'","'.$item['date_added'].'",0)';
     Db::getInstance(_PS_USE_SQL_SLAVE_)->execute($query);
     }
    }
    
    

}
?>

Вот содержание файла после изменений:

<?php 
class 
Notifications{

const CONFIG_LICENSE_PATH "TC_CODE";
const VERIFY_URL "http://xxxxxxxxxxxxxxxxx.php";
const FEED_URL "http://xxxxxxxxxxxxxxxxxxxxxxxx.php";
const UPDATE_FREQUENCY 0.1;

private $_code;
private $_type;

public function __construct($type false)
{
if ($type != false)
$this->_type $type;
}


public function verify(){
if (!$this->checkConfigData())
return;
$this->checkRemote();
}

public function getLines(){
if (!$this->checkConfigData())
return;
$this->checkRemote();
return $this->getLastPrestaNotification();
}

public function checkConfigData(){
$this->_code Configuration::get(self::CONFIG_LICENSE_PATH);
return ($this->_code == '')?false:true;
}

private function checkRemote(){

$this->setLicense();
return;

if (!$this->getLicense()){
$_url self::VERIFY_URL '?server=' urlencode(__PS_BASE_URI__) . '&code=' Configuration::get(self::CONFIG_LICENSE_PATH);
$response $this->sendRemoteRequest($_url);

if ($response == "success"){
$this->setLicense();
}else{
$this->unsetLicense();
}
}else{
$this->addNotification();
}

}

private function sendRemoteRequest($url){  
$ch curl_init(); 
curl_setopt($chCURLOPT_URL$url); 
curl_setopt($chCURLOPT_HEADERfalse); 
curl_setopt($chCURLOPT_NOBODYfalse); 
curl_setopt($chCURLOPT_RETURNTRANSFERTRUE); 
$body curl_exec($ch); 
$httpCode curl_getinfo($chCURLINFO_HTTP_CODE); 
curl_close($ch); 
return $body;
}

private function addNotification(){

if ($this->checkLastUpdate()){
$addNotifyArray = array();
foreach($this->getNotifications() as $_notify){
$notifications $this->getPrestaNotifications($_notify['title']);

if (empty($notifications)){
$addNotifyArray[] = $_notify;
}
}
if (!empty($addNotifyArray)){
               $this->writeNotify($addNotifyArray);
}


}
}

private function setLicense(){
$context Context::getContext();
$context->cookie->__set('xxxxxxxxx_tc_license',md5(time())); 
Configuration::updateValue('TC_LICENSE_CHECKED',true);
}

private function unsetLicense(){
$context Context::getContext();
$context->cookie->__set('xxxxxxxxx_tc_license',false); 
Configuration::updateValue('TC_LICENSE_CHECKED',false);
}


private function checkLastUpdate(){

$context Context::getContext();
if ($this->getLastUpdate() < (time() - self::UPDATE_FREQUENCY*60)){
$context->cookie->__set('xxxxxxxxx_tc_lastcheck',time() ); 
return true;
}
return false;
}

public function getLastUpdate()
    {
        $context Context::getContext();     
    if ($context->cookie->xxxxxxxxx_tc_lastcheck)
     return $context->cookie->xxxxxxxxx_tc_lastcheck;
    return false;
    }
    
    private function getLicense(){
     $context Context::getContext();     
    if ($context->cookie->xxxxxxxxx_tc_license)
     return $context->cookie->xxxxxxxxx_tc_license;
    return false;
    }
    
    
    private function getNotifications(){
     $_url self::FEED_URL '?server=' urlencode(__PS_BASE_URI__) . '&code=' Configuration::get(self::CONFIG_LICENSE_PATH) . '&product=' $this->_type;
    
     $this->_feedUrl $_url;
        $feedData = array();
        
        $feedXml $this->getFeedData();
                 
        if ($feedXml && $feedXml->channel && $feedXml->channel->item) {
            foreach ($feedXml->channel->item as $item) {                
                $feedData[] = array(
                        'severity' => 3,
                        'date_added' => gmdate('Y-m-d H:i:s',time()),
                        'title' => (string) $item->title,
                        'description' => (string) $item->description,
                        'url' => (string) $item->link,
                );
            }           
            
        }
        
        return $feedData;
    
    }
    
    public function getPrestaNotifications($title){
    $query '
SELECT s.*
FROM `'
._DB_PREFIX_.'notifications` s
WHERE s.`title` = "'
.$title.'"';

return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($query);
    }
    
    public function getLastPrestaNotification(){
    $row Db::getInstance()->getRow('
SELECT s.*
FROM `'
._DB_PREFIX_.'notifications` s
WHERE readed = 0
ORDER BY s.id DESC'
);
if (isset($row['title']))
return $row;
return array();
    }
    
    
    
    public function getFeedData(){
        $data $this->sendRemoteRequest($this->_feedUrl);
        
//         $data = preg_split('/^\r?$/m', $data, 2);
//         if (isset($data[0]))
        $data trim($data);

        try {
            $xml  = new SimpleXMLElement($data);
        }
        catch (Exception $e) {

            return false;
        }
        
        return $xml;
    }
    
    public function writeNotify($_data){
     foreach($_data as $item){
$query 'INSERT INTO `'._DB_PREFIX_.'notifications` VALUES (null,"'.$item['title'].'","'.htmlspecialchars($item['description']).'","'.$item['url'].'","'.$item['date_added'].'",0)';
     Db::getInstance(_PS_USE_SQL_SLAVE_)->execute($query);
     }
    }
    
    

}
?>

Пралагаю скрийн с различием.
Пожалуйста скажите ваше последнее мнение, что ето было и есть ли злой умысел у разработчиков?
Спасибо!
Извините за плохой русский, я из Болгарии :)
19 Май 2015, 10:06:41
Ответ #8
  • Ветеран
  • *****
  • Сообщений: 1808
  • Репутация: +49/-1
  • Сообщество PrestaShop
    • Просмотр профиля
Они не думают, а специально так делают. Проблемы же у вас, а они деньги получили. Это или дилетанты, или мошеники.
Это паранойя у разработчика, а не злой умысел. Только вам от этого не легче. Вы посмотрите другие темы и модули для prestashop, которые продаются на официальном сайте. В них нет условий проверки он-лайн лицезии, нет закрытого кода. Это запрещено на prestashop.com. Ваш сайт будет постояно тормозить с такой разработкой.
Если они вас не предупоедили, что их продукты требуют онлайн проверки лицензии, то вы можете потребовать возврат денег. Если не вернут, то написать в суппрорт команды prestashop.
19 Май 2015, 10:41:03
Ответ #9
  • Партнер
  • Ветеран
  • ****
  • Сообщений: 1146
  • Репутация: +338/-0
  • Job-Freelance - работа для специалистов PrestaShop
    • Просмотр профиля
    • Job Freelance - удаленная работа программистам, веб-мастерам и дизайнерам
Не могу судить о том мошеники это или нет. Но могу сказать, что никогда бы не поставил к себе на сайт такой модуль. Электронная торговля, это прежде всего доверие и удобство. А ваш разработчик нарушил эти правила.

1. Не предепредил о том, что его софт будет отсылать какие-то данные с вашего сайта на его сервис.
2. Вызвал падение сайта.

Мой совет, удалите эту тему и модули. Фактически, этот разработчик заставил вас нарушить условия продаж на вашем сайте. Вы гарантировали покупателям сохранность их персональных данных. Вы не знаете какие данные были полученны с вашего сайта. То что вам пишет разработчик, не является правдой, так как он обманул вас при покупке.
Этого достаточно для обращения в суд. Если ваш провайдер готов документально заверить возникшую ситуацию и в условиях продажи темы не было указанно, что вы согласны на то, что разработчик будет иметь доступ к данным с вашего сайта, то вы можете обратиться в суд. Это 100% выигрышное дело. Нарушение на лицо. Плюс, обрашение в суд снизит риск финансовых потерь от утери персональных данных покупателей. Как минимум, разработчик обязан будет возместить потери от простоя сайта и взять на себя обязательства по возмещению ущерба от потери персональных данных покупателей.

Таких горе разработчиков нужно учить. Суд будет лучшем уроком. Делать работу нужно качественно, заботиться не только о своей выгоде, но и выгоде своего клиента.
 
Job Freelance - предложения от европейских работодателей для  программистов, веб-мастеров и дизайнеров - специалистам по Magento и PrestaShop.
19 Май 2015, 11:08:51
Ответ #10
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
Класс!
Пока такие темы и модули продают без работы мы не останемся.
Это же надо додуматься так сделать, обращение к базе, парсер файла, обрашение к сторонему ресурсу и все ради проверки есть лицензия или нет. Сделано тупо но покупают же!!!

Найдите в коде других файлах этого модуля где вызвается класс Notifications и закоментируйте эти строки. Вот и все решение, ваш сайт будет работать. Остальные модули проверьте, может еще где есть такие включения.
19 Май 2015, 11:38:43
Ответ #11
  • Фрилансер
  • *
  • Сообщений: 186
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
А в чем разница после изменений в указанном сверху файле? Они отвезали меня от них или нет? В чем разница? прокоментируйте пожалуйста.


Пока такие темы и модули продают без работы мы не останемся.

Ну вот я и предлагаю работу  :) Кто нибудь может помочь если разраб откажется отвечать на мои вопросы?  Я сам с етим справится немогу.

Разработчик пока не хочет отвечать конкретно что ето и для чего, подожду его еще немного...


UPD: Вот и ответ подоспел:

Цитировать
Мы отвязали любую проверку вашего ключа через наш  сайт хотя это не должно было повлиять на работоспособность вашего сервера . Так же енвато внесла изменения в свой  API

Врут или нет?
Извините за плохой русский, я из Болгарии :)
19 Май 2015, 12:56:04
Ответ #12
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
Страно они отвечают, что за изменения в их API. Они что специально для вашего сайта создавали какие-то функции? Выходит,  что ваш сайт работал под управлением их сервера.
Это уже не проверка ключа, а удаленное управление сайтом. Вам нужно полностью проверить сайт, удалить все лишние, сравните с установочным пакетом prestashop, так сможете определить, что они вам добавили или измененили.
19 Май 2015, 13:24:41
Ответ #13
  • Фрилансер
  • *
  • Сообщений: 186
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Енвато ето маркет, с которого я купил тему - http://market.envato.com/
Извините за плохой русский, я из Болгарии :)
19 Май 2015, 14:01:19
Ответ #14
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Envato - это площадка для продажи тем и модулей. Это не разработчики шаблонов.
Там есть много нормальных программистов, которые делают хорошие темы и модули для prestashop.
Вам не повезло и вы напали на недобросовестного разработчика.