Падает магазин на opencart с систематичной периодичностью

C
На сайте с 18.07.2010
Offline
80
1762

Здравствуйте.

У клиента имеется интернет-магазин на ocStore Version 1.5.4.1 (OpenCart). Проблемы начались где-то более месяца назад, когда у клиента стал падать сайт, показывалась только "белая страница". Решалось это бекапом, но не надолго. Потом мне написал хостер, сказав что с аккаунта спамят, мол решай проблему с вирусами. Как оказалось вирусов было полно, и предустановленные движки какие-то левые и сотни файлов txt всяких. Нанял самородка, все удалили почистили, поменяли пароли и т.д.

Тем не менее через неделю все повторилось (нет, вирусов не появилось), а белая страница продолжала появляться. Выяснили что удалялся некий файл, который и вызывал падение system/library/mail.php, причем удалялся он систематически - если не в выходные, то в начале недели стабильно. И так продолжается до сих пор. Мы уже переносили сайт на другой акк вместе с базой, проверяли через ssh, чистили там все, меняли права, соседние сайты тоже чистили досконально меняли права, некоторые вообще удалили нафиг оттуда, но тем не менее проблема остается. Сейчас на сайте вирусов визуально нет, но раз в неделю файл обязательно удаляется и сайт падает!

Клиент не согласен оплачивать ап версии магазина, что в итоге остается делать?

K5
На сайте с 21.07.2010
Offline
209
#1

что за файл testmail.php и какое содержимое?

может он вам и не нужен (в дистрибутиве файла нет), уберите вызов и будет счастье

аська 45два48499два записки на работе (http://memoryhigh.ru) помогу с сайтом, удалю вирусы, настрою впс -> отзывы ТУТ (/ru/forum/836248) и ТАМ (http://www.maultalk.com/topic140187.html) !!!всегда проверяйте данные людей, которые сами пишут вам в аську или скайп!!!
C
На сайте с 18.07.2010
Offline
80
#2

Пардон, тупанул, файл другой:

system/library/mail.php, а testmail из корня создавал проверяльщик вирусов...

<?php

class Mail {
protected $to;
protected $from;
protected $sender;
protected $subject;
protected $text;
protected $html;
protected $attachments = array();
public $protocol = 'mail';
public $hostname;
public $username;
public $password;
public $port = 25;
public $timeout = 5;
public $newline = "\n";
public $crlf = "\r\n";
public $verp = false;
public $parameter = '';

public function setTo($to) {
$this->to = $to;
}

public function setFrom($from) {
$this->from = $from;
}

public function setSender($sender) {
$this->sender = $sender;
}

public function setSubject($subject) {
$this->subject = $subject;
}

public function setText($text) {
$this->text = $text;
}

public function setHtml($html) {
$this->html = $html;
}

public function addAttachment($filename) {
$this->attachments[] = $filename;
}

public function send() {
if (!$this->to) {
trigger_error('Error: E-Mail to required!');
exit();
}

if (!$this->from) {
trigger_error('Error: E-Mail from required!');
exit();
}

if (!$this->sender) {
trigger_error('Error: E-Mail sender required!');
exit();
}

if (!$this->subject) {
trigger_error('Error: E-Mail subject required!');
exit();
}

if ((!$this->text) && (!$this->html)) {
trigger_error('Error: E-Mail message required!');
exit();
}

if (is_array($this->to)) {
$to = implode(',', $this->to);
} else {
$to = $this->to;
}

$boundary = '----=_NextPart_' . md5(time());

$header = '';

$header .= 'MIME-Version: 1.0' . $this->newline;

if ($this->protocol != 'mail') {
$header .= 'To: ' . $to . $this->newline;
$header .= 'Subject: ' . $this->subject . $this->newline;
}

$header .= 'Date: ' . date('D, d M Y H:i:s O') . $this->newline;
$header .= 'From: ' . '=?UTF-8?B?' . base64_encode($this->sender) . '?=' . '<' . $this->from . '>' . $this->newline;
$header .= 'Reply-To: ' . '=?UTF-8?B?' . base64_encode($this->sender) . '?=' . '<' . $this->from . '>' . $this->newline;
$header .= 'Return-Path: ' . $this->from . $this->newline;
$header .= 'X-Mailer: PHP/' . phpversion() . $this->newline;
$header .= 'Content-Type: multipart/related; boundary="' . $boundary . '"' . $this->newline . $this->newline;

if (!$this->html) {
$message = '--' . $boundary . $this->newline;
$message .= 'Content-Type: text/plain; charset="utf-8"' . $this->newline;
$message .= 'Content-Transfer-Encoding: 8bit' . $this->newline . $this->newline;
$message .= $this->text . $this->newline;
} else {
$message = '--' . $boundary . $this->newline;
$message .= 'Content-Type: multipart/alternative; boundary="' . $boundary . '_alt"' . $this->newline . $this->newline;
$message .= '--' . $boundary . '_alt' . $this->newline;
$message .= 'Content-Type: text/plain; charset="utf-8"' . $this->newline;
$message .= 'Content-Transfer-Encoding: 8bit' . $this->newline . $this->newline;

if ($this->text) {
$message .= $this->text . $this->newline;
} else {
$message .= 'This is a HTML email and your email client software does not support HTML email!' . $this->newline;
}

$message .= '--' . $boundary . '_alt' . $this->newline;
$message .= 'Content-Type: text/html; charset="utf-8"' . $this->newline;
$message .= 'Content-Transfer-Encoding: 8bit' . $this->newline . $this->newline;
$message .= $this->html . $this->newline;
$message .= '--' . $boundary . '_alt--' . $this->newline;
}

foreach ($this->attachments as $attachment) {
if (file_exists($attachment)) {
$handle = fopen($attachment, 'r');

$content = fread($handle, filesize($attachment));

fclose($handle);

$message .= '--' . $boundary . $this->newline;
$message .= 'Content-Type: application/octet-stream; name="' . basename($attachment) . '"' . $this->newline;
$message .= 'Content-Transfer-Encoding: base64' . $this->newline;
$message .= 'Content-Disposition: attachment; filename="' . basename($attachment) . '"' . $this->newline;
$message .= 'Content-ID: <' . basename(urlencode($attachment)) . '>' . $this->newline;
$message .= 'X-Attachment-Id: ' . basename(urlencode($attachment)) . $this->newline . $this->newline;
$message .= chunk_split(base64_encode($content));
}
}

$message .= '--' . $boundary . '--' . $this->newline;

if ($this->protocol == 'mail') {
ini_set('sendmail_from', $this->from);

if ($this->parameter) {
sprintf($to, '=?UTF-8?B?' . base64_encode($this->subject) . '?=', $message, $header, $this->parameter);
} else {
sprintf($to, '=?UTF-8?B?' . base64_encode($this->subject) . '?=', $message, $header);
}
} elseif ($this->protocol == 'smtp') {
$handle = fsockopen($this->hostname, $this->port, $errno, $errstr, $this->timeout);

if (!$handle) {
trigger_error('Error: ' . $errstr . ' (' . $errno . ')');
exit();
} else {
if (substr(PHP_OS, 0, 3) != 'WIN') {
socket_set_timeout($handle, $this->timeout, 0);
}

while ($line = fgets($handle, 515)) {
if (substr($line, 3, 1) == ' ') {
break;
}
}

if (substr($this->hostname, 0, 3) == 'tls') {
fputs($handle, 'STARTTLS' . $this->crlf);

while ($line = fgets($handle, 515)) {
$reply .= $line;

if (substr($line, 3, 1) == ' ') {
break;
}
}

if (substr($reply, 0, 3) != 220) {
trigger_error('Error: STARTTLS not accepted from server!');
exit();
}
}

if (!empty($this->username) && !empty($this->password)) {
fputs($handle, 'EHLO ' . getenv('SERVER_NAME') . $this->crlf);

$reply = '';

while ($line = fgets($handle, 515)) {
$reply .= $line;

if (substr($line, 3, 1) == ' ') {
break;
}
}

if (substr($reply, 0, 3) != 250) {
trigger_error('Error: EHLO not accepted from server!');
exit();
}

fputs($handle, 'AUTH LOGIN' . $this->crlf);

$reply = '';

while ($line = fgets($handle, 515)) {
$reply .= $line;

if (substr($line, 3, 1) == ' ') {
break;
}
}

if (substr($reply, 0, 3) != 334) {
trigger_error('Error: AUTH LOGIN not accepted from server!');
exit();
}

fputs($handle, base64_encode($this->username) . $this->crlf);

$reply = '';

while ($line = fgets($handle, 515)) {
$reply .= $line;

if (substr($line, 3, 1) == ' ') {
break;
}
}

if (substr($reply, 0, 3) != 334) {
trigger_error('Error: Username not accepted from server!');
exit();
}

fputs($handle, base64_encode($this->password) . $this->crlf);

$reply = '';

while ($line = fgets($handle, 515)) {
$reply .= $line;

if (substr($line, 3, 1) == ' ') {
break;
}
}

if (substr($reply, 0, 3) != 235) {
trigger_error('Error['.substr($reply, 0, 3).']: Password not accepted from server!');
exit();
}
} else {
fputs($handle, 'HELO ' . getenv('SERVER_NAME') . $this->crlf);

$reply = '';

while ($line = fgets($handle, 515)) {
$reply .= $line;

if (substr($line, 3, 1) == ' ') {
break;
}
}

if (substr($reply, 0, 3) != 250) {
trigger_error('Error: HELO not accepted from server!');
exit();
}
}

if ($this->verp) {
fputs($handle, 'MAIL FROM: <' . $this->from . '>XVERP' . $this->crlf);
} else {
fputs($handle, 'MAIL FROM: <' . $this->from . '>' . $this->crlf);
}

$reply = '';

?>
C
На сайте с 18.07.2010
Offline
80
#3


while ($line = fgets($handle, 515)) {
$reply .= $line;

if (substr($line, 3, 1) == ' ') {
break;
}
}

if (substr($reply, 0, 3) != 250) {
trigger_error('Error: MAIL FROM not accepted from server!');
exit();
}

if (!is_array($this->to)) {
fputs($handle, 'RCPT TO: <' . $this->to . '>' . $this->crlf);

$reply = '';

while ($line = fgets($handle, 515)) {
$reply .= $line;

if (substr($line, 3, 1) == ' ') {
break;
}
}

if ((substr($reply, 0, 3) != 250) && (substr($reply, 0, 3) != 251)) {
trigger_error('Error: RCPT TO not accepted from server!');
exit();
}
} else {
foreach ($this->to as $recipient) {
fputs($handle, 'RCPT TO: <' . $recipient . '>' . $this->crlf);

$reply = '';

while ($line = fgets($handle, 515)) {
$reply .= $line;

if (substr($line, 3, 1) == ' ') {
break;
}
}

if ((substr($reply, 0, 3) != 250) && (substr($reply, 0, 3) != 251)) {
trigger_error('Error: RCPT TO not accepted from server!');
exit();
}
}
}

fputs($handle, 'DATA' . $this->crlf);

$reply = '';

while ($line = fgets($handle, 515)) {
$reply .= $line;

if (substr($line, 3, 1) == ' ') {
break;
}
}

if (substr($reply, 0, 3) != 354) {
trigger_error('Error: DATA not accepted from server!');
exit();
}

// According to rfc 821 we should not send more than 1000 including the CRLF
$message = str_replace("\r\n", "\n", $header . $message);
$message = str_replace("\r", "\n", $message);

$lines = explode("\n", $message);

foreach ($lines as $line) {
$results = str_split($line, 998);

foreach ($results as $result) {
if (substr(PHP_OS, 0, 3) != 'WIN') {
fputs($handle, $result . $this->crlf);
} else {
fputs($handle, str_replace("\n", "\r\n", $result) . $this->crlf);
}
}
}

fputs($handle, '.' . $this->crlf);

$reply = '';

while ($line = fgets($handle, 515)) {
$reply .= $line;

if (substr($line, 3, 1) == ' ') {
break;
}
}

if (substr($reply, 0, 3) != 250) {
trigger_error('Error: DATA not accepted from server!');
exit();
}

fputs($handle, 'QUIT' . $this->crlf);

$reply = '';

while ($line = fgets($handle, 515)) {
$reply .= $line;

if (substr($line, 3, 1) == ' ') {
break;
}
}

if (substr($reply, 0, 3) != 221) {
trigger_error('Error: QUIT not accepted from server!');
exit();
}

fclose($handle);
}
}
}
}
K5
На сайте с 21.07.2010
Offline
209
#4
что в итоге остается делать?

анализировать логи доступа и ошибок на момент удаления файла

SeVlad
На сайте с 03.11.2008
Offline
1609
#5
Carl:
Мы уже переносили сайт на другой акк

Того же хостинга?

Есть небольшая вероятность, что антивирь хостера чудит. На base64_encode реагирует.

А это в в дитсре опенкарта? Хм..

Carl:
файл другой

Большие простыни кода пости на пастебин

Делаю хорошие сайты хорошим людям. Предпочтение коммерческим направлениям. Связь со мной через http://wp.me/P3YHjQ-3.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий