| 
	| 
	
	| 
		
	| 
			
			 
			
				28.10.2012, 17:17
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 14.09.2012 
						Сообщений: 162
					 
		
 |  |  
	| 
				Безопасность клиентского кода.
			 Правильно ли я понимаю, что всякие браузерные расширения, дополнения и юзер-скрипты имеют полный доступ ко всему клиентскому коду? То есть, например, можно заменить метод XMLHttpRequest.prototype.send и совершенно прозрачно случать запросы?Хотелось бы узнать, как с этим делом обстоит у разнах браузеров?
 |  |  
	| 
		
	| 
			
			 
			
				28.10.2012, 17:35
			
			
			
		 |  
	| 
		
			
			| х.з     |  | 
					Регистрация: 21.11.2010 
						Сообщений: 4,588
					 
		
 |  |  
	| и даже скрипты подгружаемые с другого сайтаодинаково
 |  |  
	| 
		
	| 
			
			 
			
				28.10.2012, 17:47
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 14.09.2012 
						Сообщений: 162
					 
		
 |  |  
	| Причем сначала выполняется код расширений, а затем код страницы, так? |  |  
	| 
		
	| 
			
			 
			
				28.10.2012, 17:52
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 04.02.2011 
						Сообщений: 1,815
					 
		
 |  |  
	| незадумывался никогда. 
но если сначало отрабатывает код расширений,  
то думаю скрипт мог бы проверить интерисубщие его обьекты на безопасность. 
 
Думаю отличить нативную функция от скиптовой труда не составит. 
 
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;
}
				__________________Лучше калымить в гандурасе чем гандурасить на колыме
 			 Последний раз редактировалось DjDiablo, 28.10.2012 в 18:00.
 |  |  
	| 
		
	| 
			
			 
			
				28.10.2012, 18:01
			
			
			
		 |  
	| 
		
			
			| х.з     |  | 
					Регистрация: 21.11.2010 
						Сообщений: 4,588
					 
		
 |  |  
	| 
	
 
	| Сообщение от BallsShaped |  
	| Причем сначала выполняется код расширений, а затем код страницы, так? |  
	
 ну и если так -ничего не помешает запустить вредоносный через таймаут |  |  
	| 
		
	| 
			
			 
			
				28.10.2012, 18:26
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 14.09.2012 
						Сообщений: 162
					 
		
 |  |  
	| 
	
 
	| Сообщение от 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() );
			 Последний раз редактировалось BallsShaped, 28.10.2012 в 20:23.
 |  |  
	| 
		
	| 
			
			 
			
				28.10.2012, 18:27
			
			
			
		 |  
	| 
		
			
			| что-то знаю       |  | 
					Регистрация: 24.05.2009 
						Сообщений: 5,176
					 
		
 |  |  
	| 
	
 
	| Сообщение от 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();
 |  |  
	| 
		
	| 
			
			 
			
				28.10.2012, 18:32
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 04.02.2011 
						Сообщений: 1,815
					 
		
 |  |  
	| есть идеи лучше ? 
и кстатии devote
 
var x=function(){alert(100)};
var old=x, x=function(){alert(100500)};
x.toString = function() {
    return old.toString();
}
alert( x.toString );
				__________________Лучше калымить в гандурасе чем гандурасить на колыме
 			 Последний раз редактировалось DjDiablo, 28.10.2012 в 18:42.
 |  |  
	| 
		
	| 
			
			 
			
				28.10.2012, 18:41
			
			
			
		 |  
	| 
		
			|  | Матрос       |  | 
					Регистрация: 04.04.2008 
						Сообщений: 6,246
					 
		
 |  |  
	| Навскидку все встроенные функции  приводятся к строке вида 
function send() {
    [native code]
}
С точностью до пробела, и возможно имени функции. 
Проверяйте так. 
Только используйте встроенный в Object метод toString 
Хотя и его могут подменить
 
Но в случае подмены скрипта плагином, вы все равно навряд ли где-то найдете оригинальную функцию |  |  
	| 
		
	| 
			
			 
			
				28.10.2012, 20:23
			
			
			
		 |  
	| 
		
			
			| что-то знаю       |  | 
					Регистрация: 24.05.2009 
						Сообщений: 5,176
					 
		
 |  |  
	| 
	
 
	| Сообщение от Gvozd |  
	| С точностью до пробела |  
	
 не согласен, опера например делает в одну строку, ИЕ тоже делает иначе.. да и вообще все браузеры по разному.
 
	
 
	| Сообщение от DjDiablo |  
	| и кстатии devote |  
	
 кто же спорит, но обойти это не проблема в любом случае, и проверка через toString бредовая идея |  |  |  |