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

Угроза «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. Я не говорю, что это единственная причина, по которой может появиться предупреждение в виде такого сообщения от горячо любимого антивируса, ведь могут быть и случаи существования действительно «левого скрипта» на вашем сайте.

Комментарии (20)


  1. Psychosynthesis
    31.03.2015 01:39
    +2

    Так и почему?


    1. Prologos Автор
      31.03.2015 21:48
      -1

      Это и есть наш вопрос — ведь не должен был…


  1. kosmos89
    31.03.2015 01:58
    +4

    О! Опять картинка, которая загружается снизу-вверх!


    1. EnterSandman
      31.03.2015 02:36
      +1

      У вас до сих пор диалап?


      1. kosmos89
        31.03.2015 03:09
        +3

        FTTH 120 Mb/s, на самом деле. Но BMP и этого мало.


        1. Prologos Автор
          31.03.2015 07:19
          -1

          Заменил картинку на png.


          1. yjurfdw
            31.03.2015 14:26
            -3

            Месье знает толк…


            1. Prologos Автор
              31.03.2015 16:28

              Спасибо за ваш комментарий и за мою карму. Ждите долго еще когда у меня появятся мотивы стараться писать для вас статьи.


              1. Prologos Автор
                31.03.2015 19:06
                +1

                Простите, всплеск эмоций


  1. EnterSandman
    31.03.2015 02:41

    таки да. включил режим модемной скорости в fiddler и увидел.
    ответ на ваше беспокойство — всё потому что картинка BMP.


  1. Ivan_83
    31.03.2015 04:34

    Решение простое: удалить касперского, выключить скрипты :)


    1. andyudol
      31.03.2015 07:15
      +5

      Полумеры. Надо:

      1. Отключить сеть. Физически.
      2. Деинсталировать всё программное обеспечение. Прикладное и системное.
      3. Выключить компьютер.
      4. Демонтировать процессор, материнскую плату и все устройства хранения данных.


  1. garex
    31.03.2015 07:19
    +1

    Это скорее бага в касперском — false positive. Напишите им туда.


  1. trilodi
    31.03.2015 07:57
    +1

    Уже неоднократно сталкивался с этими детектами в Касперском. Бывали даже случаи что окошко не выходит, просто фаервол касперского режет скрипты, а клиент усердно доказывает то что моя работа не функционирует должным образом. Иной раз очень сложно выявить проблему когда каспер режет скрипты без предупреждения.


  1. sayber
    31.03.2015 08:30
    +2

    любимого антивируса Касперского — бугагашеньки


  1. andrewsch
    31.03.2015 08:51
    +2

    У нас часто некоторые AJAX запросы начинают по пол-минуты грузиться из-за Касперского.
    В тех-поддержку пробовали писать, но безрезультатно…


    1. trilodi
      31.03.2015 08:53

      Да, пробовал тоже писать о такой ерунде, и тоже тщетно


  1. vitvad
    31.03.2015 10:48
    +2

    Prologos,

            delete request;
    

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

    ну или delete window.request;


  1. pansa
    01.04.2015 00:28

    Фолс эвристика, очевидно. У всех иногда бывает, что делать. Эвристик на то и эвристик.


    1. vzakladkenet
      01.04.2015 19:21
      +1

      а вот и ответ на вопрос — эвристика, никогда каспера не любил из-за его тормозов; занятная статейка…