Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Безопасность клиентского кода. (https://javascript.ru/forum/misc/32739-bezopasnost-klientskogo-koda.html)

BallsShaped 28.10.2012 17:17

Безопасность клиентского кода.
 
Правильно ли я понимаю, что всякие браузерные расширения, дополнения и юзер-скрипты имеют полный доступ ко всему клиентскому коду? То есть, например, можно заменить метод XMLHttpRequest.prototype.send и совершенно прозрачно случать запросы?
Хотелось бы узнать, как с этим делом обстоит у разнах браузеров?

dmitriymar 28.10.2012 17:35

и даже скрипты подгружаемые с другого сайта
одинаково

BallsShaped 28.10.2012 17:47

Причем сначала выполняется код расширений, а затем код страницы, так?

DjDiablo 28.10.2012 17:52

незадумывался никогда.

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

Думаю отличить нативную функция от скиптовой труда не составит.
alert(alert);
alert(  function(){alert(100) });

var x=function(){alert(100)};

alert(x.toString().length);

if ( test(x,23) ) alert ('функцию подменили');
else alert('функция в порядке');

var x=function(){alert(100500)};

if ( test(x,23) ) alert ('функцию подменили');
else alert('функция в порядке');


function test(f,c){
    return f.toString().length!=c;
}

dmitriymar 28.10.2012 18:01

Цитата:

Сообщение от BallsShaped
Причем сначала выполняется код расширений, а затем код страницы, так?

ну и если так -ничего не помешает запустить вредоносный через таймаут

BallsShaped 28.10.2012 18:26

Цитата:

Сообщение от dmitriymar
ну и если так -ничего не помешает запустить вредоносный через таймаут

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

Сообщение от DjDiablo
Думаю отличить нативную функция от скиптовой труда не составит.

Наивный:
var replaceNativeFunction = new function (){
  var functionList = [],
      originalList = [];

  function replaceNativeFunction( object, methodName, newMethod ){
    functionList.push( newMethod );
    originalList.push( object[ methodName ] );
    object[ methodName ] = newMethod;
  };

  replaceNativeFunction.getOriginal = function ( method ){
    var index = functionList.indexOf( method );
    return originalList[ index ];
  };

  replaceNativeFunction( Function.prototype, "toString", function ToString(){
      if( this.toString == ToString )
        return replaceNativeFunction.getOriginal( ToString ).call( replaceNativeFunction.getOriginal( this ) );
      return this.toString();
    } ); 

  return replaceNativeFunction;    
};

replaceNativeFunction( window, "alert", function newAlert( message ){
  var originalAlert = replaceNativeFunction.getOriginal( newAlert );
  originalAlert( message );
  originalAlert( "Trololo!!!" );
} );

alert( alert.toString() );

devote 28.10.2012 18:27

Цитата:

Сообщение от DjDiablo
Думаю отличить нативную функция от скиптовой труда не составит.

тока ты забываешь что в разных браузерах разная длинна, например у меня в опере 22 символа а не 23. Да и это обойти не составит труда:
var x=function(){alert(100)};

var old=x, x=function(){alert(100500)};
x.toString = function() {
    return old.toString();
}

alert( x.toString() );
x();

DjDiablo 28.10.2012 18:32

есть идеи лучше ?
и кстатии devote

var x=function(){alert(100)};

var old=x, x=function(){alert(100500)};
x.toString = function() {
    return old.toString();
}
alert( x.toString );

Gvozd 28.10.2012 18:41

Навскидку все встроенные функции приводятся к строке вида
function send() {
    [native code]
}

С точностью до пробела, и возможно имени функции.
Проверяйте так.
Только используйте встроенный в Object метод toString
Хотя и его могут подменить

Но в случае подмены скрипта плагином, вы все равно навряд ли где-то найдете оригинальную функцию

devote 28.10.2012 20:23

Цитата:

Сообщение от Gvozd
С точностью до пробела

не согласен, опера например делает в одну строку, ИЕ тоже делает иначе.. да и вообще все браузеры по разному.

Цитата:

Сообщение от DjDiablo
и кстатии devote

кто же спорит, но обойти это не проблема в любом случае, и проверка через toString бредовая идея


Часовой пояс GMT +3, время: 08:11.