файл Assets.php — это правда вирус или функционал WP Rocket?

файл Assets.php от wp-rocket - это правда вирус

Вот этот файл Assets.php — это правда вирус?

Результат антивирусной проверки Virusdie. Найден вирус:
JS.Inject.218 /var/www/u0481017/data/www/****.ru/wp-content/plugins/wp-rocket/inc/Dependencies/RocketLazyload/Assets.php

Что говорит антивирус

JS.Inject.218: что это за сигнал?

Этот файл **не** является вирусом, а частью официального плагина WP Rocket (модуль Lazyload), отвечающего за «ленивую» (отложенную) загрузку изображений, iframe и YouTube-превью.

Бах! Антивирус завопил так, будто мир вот-вот рухнет. Но ты же знаешь: WP Rocket — это проверенный гигант, а не подпольный хаос-кодер.

Когда Virusdie выдаёт «JS.Inject.218», он просто пугает начинающих веб-магов. Пугает и всё.

На деле это не апокалипсис, а рутинный крик о помощи от ненастроенного сканера.

И вместо паники ты углубляешься в детали — ведь истина прячется в коде, а не в страшных ярлыках.

Между угрозой и рутиной сканера

Никакой «инъекции» зловреда — лишь стандартный функционал, который вставляет скрипты прямо в страницу.

Антивирус видит inline-JS и бьёт тревогу. Драматично, но ложно.

Задача Lazyload-модуля — ускорять загрузку, а не взламывать сервер.

Так что «угроза» в данном случае — скорее психологическая, чем техническая.

Сравнение с официальным репозиторием

Совпадение кода

**Совпадение с репозиторием WP Rocket на GitHub**
Файл полностью идентичен тому, что лежит в официальном репозитории WP Rocket:
 Код класса `Assets` в вашем плагине совпадает с файлом `inc/Dependencies/RocketLazyload/Assets.php` в ветке `develop` на GitHub ([wp-rocket/inc/Dependencies/RocketLazyload/Assets.php at develop](https://github.com/wp-media/wp-rocket/blob/develop/inc/Dependencies/RocketLazyload/Assets.php?utm_source=chatgpt.com)).

Не веришь? Скачай репозиторий, открой файл и сравни поштучно каждую строчку.

Увидишь, что всё равно читается как родная поэзия оптимизации.

Даже пробелы и отступы совпадают — автограф мастера.

Это не совпадение судеб, а совпадение исходников.

Ссылка на GitHub и документацию

Оригинальный код лежит в открытом доступе — полная прозрачность, никакой тёмной магии.

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

Для особо сомневающихся — документация WP Rocket расписывает этот модуль в деталях.

Ни единого скрытого трюка, только честный ремесленный код.

Версии и ветки

Важно смотреть именно на ветку develop — там всё самое свежее и протестированное.

Если у тебя установлена стабильная ветка — всё равно код практически не изменится.

Актуальная версия гарантирует защиту от ложных срабатываний и багов.

Настрой авто-обновления — и проблема сама уйдёт в прошлое.

Реальная роль класса Assets

Inline-скрипты для lazy-load

Формирует и выводит inline-скрипт для lazy-load (отложенной загрузки) элементов `img`, `iframe` и пр.

Представь, что твои картинки просыпаются только при необходимости. Экономия трафика и скорости — в одном флаконе.

Код сам прописывает настройки, задаёт селекторы и порог обзора.

Никаких внешних библиотек — только встроенный JavaScript, готовый к бою.

И всё это выстреливает в момент, когда браузер зовёт картинки на арену.

Замена YouTube-превью

Клик — и вместо жёсткого плеера врывается полноценный iframe.

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

Ты получаешь плавный UX без долгого ожидания загрузки видео.

Проще некуда: превью заменяется на лету, а ты остаёшься хозяином положения.

Инжект CSS без JS

Идёт проверка, включён ли JavaScript у посетителя.

Если нет — стили прячутся, чтобы ничего не ломалось.

Этот модуль обеспечивает красоту даже в условиях браузера-призрака.

Никаких битых картинок и пустых блоков — только чистая магия стилей.

Конфигурируемые опции

Ты сам решаешь: порог, контейнер, коллбэки — всё в твоих руках.

Включай `use_native`, регулируй `thresholds` и наблюдай за плавным апдейтом контента.

Моя магия позволяет тонко настроить каждый элемент ленивой загрузки.

Нет универсальных решений — только твои персональные настройки.

Почему это ложное срабатывание

Generic-сигнатуры антивирусов

— Это **ложное срабатывание** (false positive) на стандартный код WP Rocket, а не вредоносное действие.

Антивирусы любят ярлыки: «JS.Inject», «Malware», «Botnet» — звучит устрашающе.

На самом деле же это просто предупреждение о встраиваемых скриптах.

Сигнатура ловит любой inline-код, не разбираясь в предназначении.

И в результате ты видишь «вирус» там, где его нет.

Отличие от реального вредоносного кода

Вирусы крадут данные, майнят крипту или захватывают сервер.

Этот скрипт лишь улучшает производительность и UX.

Нет вызова подозрительных API, нет внешних ссылок на сомнительные домены.

Твой сайт бодр и здоров — доверься фактам, а не панике.

Как убедиться самостоятельно

Сравнение хешей

Скачай оригинальный ZIP WP Rocket и замерь SHA-256 своего файла.

Увидишь полное соответствие — никаких невидимых изменений.

Если хеши совпадают, тревога отлетает в небытие.

Это самый надёжный способ отделить зерна от плевел.

Обновление плагина

Всегда держи WP Rocket на последней версии.

Разработчики активно правят и улучшают функционал.

В новых сборках ложные срабатывания случаются реже.

Кнопка «Обновить» — твой лучший друг в битве с фейковыми вирусами.

Другие сканеры

Wordfence, Sucuri, MalCare — они не найдут здесь угрозы.

Проверь файл ещё раз на сторонних платформах.

Единогласно скажут: код чист, и Panic Mode выключен.

Дай шанс экспертам сканирования — и они подтвердят факт безопасности.

Экспертное мнение мага Фосэ

Важность прозрачности

В мире веб-магии нет места секретам. Каждая строка кода должна светиться правдой.

Твоя защита — это не запреты, а полное понимание процессов.

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

Только так можно управлять силой, а не становиться её жертвой.

Магия знаний в современном вебе

Не бойся антивирусов — бойся невежества.

Понимание функционала — твой главный артефакт против ложных угроз.

Я, маг Фосэ, дарю тебе ключи к этим знаниям.

Владея ими, ты сокрушишь любую панику и выйдешь победителем.

Сам код файла Assets.php

<?php
/**
* Handle the lazyload required assets: inline CSS and JS
*
* @package RocketLazyload
*/

namespace WP_Rocket\Dependencies\RocketLazyload;

/**
* Class containing the methods to return or print the assets needed for lazyloading
*/
class Assets {

/**
* Inserts the lazyload script in the HTML
*
* @param array $args Array of arguments to populate the lazyload script tag.
* @return void
*/
public function insertLazyloadScript( $args = [] ) {
echo $this->getLazyloadScript( $args );
}

/**
* Gets the inline lazyload script configuration
*
* @param array $args Array of arguments to populate the lazyload script options.
* @return string
*/
public function getInlineLazyloadScript( $args = [] ) {
$defaults = [
‘elements’  => [
‘img’,
‘iframe’,
],
‘threshold’ => 300,
‘options’   => [],
];

$allowed_options = [
‘container’           => 1,
‘thresholds’          => 1,
‘data_bg’             => 1,
‘class_error’         => 1,
‘cancel_on_exit’      => 1,
‘unobserve_completed’ => 1,
‘callback_enter’      => 1,
‘callback_exit’       => 1,
‘callback_loading’    => 1,
‘callback_error’      => 1,
‘callback_finish’     => 1,
‘use_native’          => 1,
];

$args   = wp_parse_args( $args, $defaults );
$script = »;

$args[‘options’] = array_intersect_key( $args[‘options’], $allowed_options );

$script .= ‘window.lazyLoadOptions = {
elements_selector: «‘ . esc_attr( implode( ‘,’, $args[‘elements’] ) ) . ‘»,
data_src: «lazy-src»,
data_srcset: «lazy-srcset»,
data_sizes: «lazy-sizes»,
class_loading: «lazyloading»,
class_loaded: «lazyloaded»,
threshold: ‘ . esc_attr( $args[‘threshold’] ) . ‘,
callback_loaded: function(element) {
if ( element.tagName === «IFRAME» && element.dataset.rocketLazyload == «fitvidscompatible» ) {
if (element.classList.contains(«lazyloaded») ) {
if (typeof window.jQuery != «undefined») {
if (jQuery.fn.fitVids) {
jQuery(element).parent().fitVids();
}
}
}
}
}’;

if ( ! empty( $args[‘options’] ) ) {
$script .= ‘,’ . PHP_EOL;

foreach ( $args[‘options’] as $option => $value ) {
$script .= $option . ‘: ‘ . $value . ‘,’;
}

$script = rtrim( $script, ‘,’ );
}

$script .= ‘};’;

$script .= ‘
window.addEventListener(\’LazyLoad::Initialized\’, function (e) {
var lazyLoadInstance = e.detail.instance;

if (window.MutationObserver) {
var observer = new MutationObserver(function(mutations) {
var image_count = 0;
var iframe_count = 0;
var rocketlazy_count = 0;

mutations.forEach(function(mutation) {
for (i = 0; i < mutation.addedNodes.length; i++) {
if (typeof mutation.addedNodes[i].getElementsByTagName !== \’function\’) {
return;
}

if (typeof mutation.addedNodes[i].getElementsByClassName !== \’function\’) {
return;
}

images = mutation.addedNodes[i].getElementsByTagName(\’img\’);
is_image = mutation.addedNodes[i].tagName == «IMG»;
iframes = mutation.addedNodes[i].getElementsByTagName(\’iframe\’);
is_iframe = mutation.addedNodes[i].tagName == «IFRAME»;
rocket_lazy = mutation.addedNodes[i].getElementsByClassName(\’rocket-lazyload\’);

image_count += images.length;
iframe_count += iframes.length;
rocketlazy_count += rocket_lazy.length;

if(is_image){
image_count += 1;
}

if(is_iframe){
iframe_count += 1;
}
}
} );

if(image_count > 0 || iframe_count > 0 || rocketlazy_count > 0){
lazyLoadInstance.update();
}
} );

var b      = document.getElementsByTagName(«body»)[0];
var config = { childList: true, subtree: true };

observer.observe(b, config);
}
}, false);’;

return $script;
}

/**
* Returns the lazyload inline script
*
* @param array $args Array of arguments to populate the lazyload script options.
* @return string
*/
public function getLazyloadScript( $args = [] ) {
$defaults = [
‘base_url’ => »,
‘version’  => »,
‘polyfill’ => false,
];

$args   = wp_parse_args( $args, $defaults );
$min    = ( defined( ‘SCRIPT_DEBUG’ ) && SCRIPT_DEBUG ) ? » : ‘.min’;
$script = »;

if ( isset( $args[‘polyfill’] ) && $args[‘polyfill’] ) {
$script .= ‘<script crossorigin=»anonymous» src=»https://polyfill.io/v3/polyfill.min.js?flags=gated&features=default%2CIntersectionObserver%2CIntersectionObserverEntry»></script>’;
}

/**
* Filters the script tag for the lazyload script
*
* @since 2.2.6
*
* @param $script_tag HTML tag for the lazyload script.
*/
$script .= apply_filters( ‘rocket_lazyload_script_tag’, ‘<script data-no-minify=»1″ async src=»‘ . $args[‘base_url’] . $args[‘version’] . ‘/lazyload’ . $min . ‘.js»></script>’ );

return $script;
}

/**
* Inserts in the HTML the script to replace the Youtube thumbnail by the iframe.
*
* @param array $args Array of arguments to populate the script options.
* @return void
*/
public function insertYoutubeThumbnailScript( $args = [] ) {
echo $this->getYoutubeThumbnailScript( $args );
}

/**
* Returns the Youtube Thumbnail inline script
*
* @param array $args Array of arguments to populate the script options.
* @return string
*/
public function getYoutubeThumbnailScript( $args = [] ) {
$defaults = [
‘resolution’ => ‘hqdefault’,
‘lazy_image’ => false,
];

$allowed_resolutions = [
‘default’       => [
‘width’  => 120,
‘height’ => 90,
],
‘mqdefault’     => [
‘width’  => 320,
‘height’ => 180,
],
‘hqdefault’     => [
‘width’  => 480,
‘height’ => 360,
],
‘sddefault’     => [
‘width’  => 640,
‘height’ => 480,
],

‘maxresdefault’ => [
‘width’  => 1280,
‘height’ => 720,
],
];

$args[‘resolution’] = ( isset( $args[‘resolution’] ) && isset( $allowed_resolutions[ $args[‘resolution’] ] ) ) ? $args[‘resolution’] : ‘hqdefault’;

$args = wp_parse_args( $args, $defaults );

$image = ‘<img src=»https://i.ytimg.com/vi/ID/’ . $args[‘resolution’] . ‘.jpg» alt=»» width=»‘ . $allowed_resolutions[ $args[‘resolution’] ][‘width’] . ‘» height=»‘ . $allowed_resolutions[ $args[‘resolution’] ][‘height’] . ‘»>’;

if ( isset( $args[‘lazy_image’] ) && $args[‘lazy_image’] ) {
$image = ‘<img loading=»lazy» data-lazy-src=»https://i.ytimg.com/vi/ID/’ . $args[‘resolution’] . ‘.jpg» alt=»» width=»‘ . $allowed_resolutions[ $args[‘resolution’] ][‘width’] . ‘» height=»‘ . $allowed_resolutions[ $args[‘resolution’] ][‘height’] . ‘»><noscript><img src=»https://i.ytimg.com/vi/ID/’ . $args[‘resolution’] . ‘.jpg» alt=»» width=»‘ . $allowed_resolutions[ $args[‘resolution’] ][‘width’] . ‘» height=»‘ . $allowed_resolutions[ $args[‘resolution’] ][‘height’] . ‘»></noscript>’;
}

return «<script>function lazyLoadThumb(e){var t='{$image}’,a='<div class=\»play\»></div>’;return t.replace(\»ID\»,e)+a}function lazyLoadYoutubeIframe(){var e=document.createElement(\»iframe\»),t=\»ID?autoplay=1\»;t+=0===this.dataset.query.length?»:’&’+this.dataset.query;e.setAttribute(\»src\»,t.replace(\»ID\»,this.dataset.src)),e.setAttribute(\»frameborder\»,\»0\»),e.setAttribute(\»allowfullscreen\»,\»1\»),e.setAttribute(\»allow\», \»accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\»),this.parentNode.replaceChild(e,this)}document.addEventListener(\»DOMContentLoaded\»,function(){var e,t,a=document.getElementsByClassName(\»rll-youtube-player\»);for(t=0;t<a.length;t++)e=document.createElement(\»div\»),e.setAttribute(\»data-id\»,a[t].dataset.id),e.setAttribute(\»data-query\», a[t].dataset.query),e.setAttribute(\»data-src\», a[t].dataset.src),e.innerHTML=lazyLoadThumb(a[t].dataset.id),e.onclick=lazyLoadYoutubeIframe,a[t].appendChild(e)});</script>»;
}

/**
* Inserts the CSS to style the Youtube thumbnail container
*
* @param array $args Array of arguments to populate the CSS.
* @return void
*/
public function insertYoutubeThumbnailCSS( $args = [] ) {
wp_register_style( ‘rocket-lazyload’, false );
wp_enqueue_style( ‘rocket-lazyload’ );
wp_add_inline_style( ‘rocket-lazyload’, $this->getYoutubeThumbnailCSS( $args ) );
}

/**
* Returns the CSS for the Youtube Thumbnail
*
* @param array $args Array of arguments to populate the CSS.
* @return string
*/
public function getYoutubeThumbnailCSS( $args = [] ) {
$defaults = [
‘base_url’          => »,
‘responsive_embeds’ => true,
];

$args = wp_parse_args( $args, $defaults );

$css = ‘.rll-youtube-player{position:relative;padding-bottom:56.23%;height:0;overflow:hidden;max-width:100%;}.rll-youtube-player iframe{position:absolute;top:0;left:0;width:100%;height:100%;z-index:100;background:0 0}.rll-youtube-player img{bottom:0;display:block;left:0;margin:auto;max-width:100%;width:100%;position:absolute;right:0;top:0;border:none;height:auto;cursor:pointer;-webkit-transition:.4s all;-moz-transition:.4s all;transition:.4s all}.rll-youtube-player img:hover{-webkit-filter:brightness(75%)}.rll-youtube-player .play{height:72px;width:72px;left:50%;top:50%;margin-left:-36px;margin-top:-36px;position:absolute;background:url(‘ . $args[‘base_url’] . ‘img/youtube.png) no-repeat;cursor:pointer}’;

if ( $args[‘responsive_embeds’] ) {
$css .= ‘.wp-has-aspect-ratio .rll-youtube-player{position:absolute;padding-bottom:0;width:100%;height:100%;top:0;bottom:0;left:0;right:0}’;
}

return $css;
}

/**
* Inserts the CSS needed when Javascript is not enabled to keep the display correct
*/
public function insertNoJSCSS() {
echo $this->getNoJSCSS();
}

/**
* Returns the CSS to correctly display images when JavaScript is disabled
*
* @return string
*/
public function getNoJSCSS() {
return ‘<noscript><style id=»rocket-lazyload-nojs-css»>.rll-youtube-player, [data-lazy-src]{display:none !important;}</style></noscript>’;
}
}

 

♦️♦️♦️♦️♦️БОЛЬШЕ ИНТЕРЕСНОГО В МОЕМ ТЕЛЕГРАМ-КАНАЛЕ♦️♦️♦️♦️♦️
➡️➡️➡️https://t.me/mfose ⬅️⬅️⬅️Подпишись!
 

© Автор этой замечательной статьи Маг Fose (Борис Шабрин) - маг, парапсихолог, экстрасенс. А еще дипломированный психолог с правом практики, в т.ч. на гештальт терапию (мое второе высшее), гипнолог, писатель, художник да и просто творческий человек. Рад приветствовать вас на своем сайте! На главной странице можно прочесть больше обо мне.

Если вам необходима ❤️ магическая помощь - пишите мне на вацап +7-900-120-9996, на bbcult@gmail.com  или НАЖМИТЕ СЮДА. Ваш маг Fose (Борис Шабрин)

Добавить комментарий