Почему Касперский определяет на сайте троян HEUR:Trojan.Script.Generic? (и возможный способ устранения)

    Доброго времени суток. У меня созрела еще одна статья, касающаяся безопасности, а точнее доступа к Вашим сайтам, уважаемые вебмастера… и позвольте мне Вам рассказать.

    Угроза «HEUR:Trojan.Script.Generic»


    Возможно у Вас есть сайт и Вы не использовали библиотеки типа jQuery, а решили просто на яваскрипте «спагетти-код на сайте намотать» (пусть как я, ради спортивного интереса). И тут Вы наверное даже не ожидаете такой «подлости» от любимого антивируса Касперского, тем более если Вы им не пользуетесь… а пользуется Ваш друг. Он то и увидит такое сообщение на Вашем сайте «объект заражен HEUR:Trojan.Script.Generic»:

    А тем временем, другие антивирусы молчат.


    Чтобы рассказать Вам в чем тут дело, я вынужден привести код на яваскрипте, поэтому про него и буду рассказывать далее.
    Решил значит я с даталистом поиграться для организации автокомплита без сторонних библиотек (появилось в HTML5 такое чудо, да беда у него с русскими буквами правда, пардон за оффтоп).
    Написал код формы:

    <form method="get" action="" >
      <input type="search" name="q" value="<?= $q; ?>" list="json-datalist" id="i_search" autocomplete="off" />
      <input type="submit" value=" Искать " />
    </form>
    <datalist id="json-datalist"></datalist>
    


    И следом написал, как мне казалось, безобидный код:
    // Принимаем элементы <datalist> и <input> 
    var dataList = document.getElementById('json-datalist');
    var input = document.getElementById('i_search');
    // Создаем новый XMLHttpRequest.
    var request = new XMLHttpRequest();
    // Перехватываем состояние запроса.
    request.onreadystatechange = function(response) {
      if (request.readyState === 4) {
        if (request.status === 200) {
          var jsonOptions = JSON.parse(request.responseText); // Parse the JSON
          // Перебираем массив JSON 
          jsonOptions.forEach(function(item) {
            var option = document.createElement('option');
             // Устанавливаем значение с помощью элемента в json-массив.
            option.value = decodeURIComponent(unescape(item)); 
            // Добавляем элементы списка <option> к <datalist>.
            dataList.appendChild(option); 
          });
          input.placeholder = "Please type"; 
        } else {
          // Если произошла ошибка
          input.placeholder = "Couldn't load datalist";
        }
      }
    };
    // обновим плейсхолдер
    input.placeholder = "Loading options...";
    
    //  Установить и сделать запрос
    request.open('GET', URL_BASE+'/data.json', true);
    request.send();
    


    Получаем наш троян!
    — Где троян? Вы не видите? О, и я тоже не вижу, а Касперский видит!
    А видит он его здесь:
     request.open('GET', URL_BASE+'/data.json', true);
    

    Тогда убираем эту строчку и все в порядке — наш скрипт не работает, и антивирус спокоен.

    «Разбор полетов»


    Значит нужно поковыряться в перехватчике состояния запроса — onreadystatechange.
    Нашим лекарством будет отдельная функция, назовем ее updatePage, в которую мы напишем перебор возвращаемого JSON-массива и присвоим ее здесь в нашем перехватчике состояния:
     request.onreadystatechange = updatePage;
    


    В итоге переписал код так, что антивирус Касперского больше нас не тревожит:
    var dataList = document.getElementById('json-datalist');
    var input = document.getElementById('i_search');
    var url = URL_BASE + '/data.json';
    var request = null;
    if(window.XMLHttpRequest)
    request = new XMLHttpRequest();
    else if (window.ActiveXObject)
    request  = new ActiveXObject(Microsoft.XMLHTTP);
    	function updatePage()
    	{
    	  if (request.readyState == 4)
    		if (request.status == 200)
    		{
    			var jsonOptions = JSON.parse(request.responseText);
    			jsonOptions.forEach(function(item) {
    				var option = document.createElement('option');
    				option.value = item;
    				dataList.appendChild(option);
    			});
    			input.placeholder = "Please type";
    		delete request;
    		}
    		else
    		{
    			input.placeholder = "Couldn't load datalist";
    		}
    	}
    request = getXmlHttp();
    request.open("GET", url, true);
    request.onreadystatechange = updatePage;
    request.send(null);
    

    P.S. Я не говорю, что это единственная причина, по которой может появиться предупреждение в виде такого сообщения от горячо любимого антивируса, ведь могут быть и случаи существования действительно «левого скрипта» на вашем сайте.
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 20

      +2
      Так и почему?
        –1
        Это и есть наш вопрос — ведь не должен был…
        +4
        О! Опять картинка, которая загружается снизу-вверх!
          +1
          У вас до сих пор диалап?
            +3
            FTTH 120 Mb/s, на самом деле. Но BMP и этого мало.
              –1
              Заменил картинку на png.
                –3
                Месье знает толк…
                  0
                  Спасибо за ваш комментарий и за мою карму. Ждите долго еще когда у меня появятся мотивы стараться писать для вас статьи.
                    +1
                    Простите, всплеск эмоций
          0
          таки да. включил режим модемной скорости в fiddler и увидел.
          ответ на ваше беспокойство — всё потому что картинка BMP.
          • UFO just landed and posted this here
              +5
              Полумеры. Надо:
              1. Отключить сеть. Физически.
              2. Деинсталировать всё программное обеспечение. Прикладное и системное.
              3. Выключить компьютер.
              4. Демонтировать процессор, материнскую плату и все устройства хранения данных.
              +1
              Это скорее бага в касперском — false positive. Напишите им туда.
                +1
                Уже неоднократно сталкивался с этими детектами в Касперском. Бывали даже случаи что окошко не выходит, просто фаервол касперского режет скрипты, а клиент усердно доказывает то что моя работа не функционирует должным образом. Иной раз очень сложно выявить проблему когда каспер режет скрипты без предупреждения.
                  +2
                  любимого антивируса Касперского — бугагашеньки
                    +2
                    У нас часто некоторые AJAX запросы начинают по пол-минуты грузиться из-за Касперского.
                    В тех-поддержку пробовали писать, но безрезультатно…
                      0
                      Да, пробовал тоже писать о такой ерунде, и тоже тщетно
                      +2
                      Prologos,
                              delete request;
                      

                      Это не работает. console.log( delete request ); // false;
                      Лучше request = null;

                      ну или delete window.request;
                        0
                        Фолс эвристика, очевидно. У всех иногда бывает, что делать. Эвристик на то и эвристик.
                          +1
                          а вот и ответ на вопрос — эвристика, никогда каспера не любил из-за его тормозов; занятная статейка…

                        Only users with full accounts can post comments. Log in, please.