자바스크립트 리눅스

JAVASCRIPT/TIP 2011/10/07 13:42 Posted by <!--r'i"z&i\n+#]]x juree23
TAG

자바스크립트 오버라이드

JAVASCRIPT/TIP 2008/07/06 00:32 Posted by <!--r'i"z&i\n+#]]x juree23
요약

Ajax어플리케이션이라 불리우는 리치 웹 어플리케이션들은 데이터 전송기술로서 자바스크립트를 사용하여 만든다. 이번 지면에서는 제목처럼 자바스크립트 하이잭킹, 즉 취약성에 대해서 다룬다.
공격은 웹브라우저의 강제 SOP(Same Origin Policy)를 우회하는 <script>태그를 사용하여 시작된다.
전통적인 웹어플리케이션들은 취약하지 않았다. 왜냐하면, 과거의 것들은 데이터 전송기술로 자바스크립트를 이용하지 않았기 때문이다.

우 리는 유명한 12개의 Ajax프레임워크를 분석했다.[ 서버사이드용 4개 : DWR(Direct Web Remoting), Atlas(ASP.NET Ajax), xajax, GWT(Google Web Toolkit), 클라이언트용 라이브러리 8개 : PrototypeJS, Script.aculo.us, Dojo, Moo.fx, jQuery, YUI, Rico, MochiKit]  
위의 것들중 유일하게 DWR 2.0만이 자바스크립트 하이잭킹을 막기위해 구현한 것이 존재했다. 대부분의 프레임워크들은 어떠한 보호장치도 제공하지 않았고, 그들의 문서에서 조차 보안에 관련된 내용을 언급하지 않았다.

우리는 두가지의 완화법에 대해서 논의할 것이다. 악의 있는 요청을 줄이는것과 자바스크립트를 직접실행하는 공격자에 대한 방어가 그것이다.

1. 소개
비 록 'Web 2.0'이란 단어가 정확한 정의를 가지고 있지는 않지만, 최근엔 일반적으로 두가지로 사용되고 있다. 첫번째는 'Web 2.0'이 웹 어플리케이션으로 하여금 사회적 상호작용 또는 일반적 합의점을 제공하는 것이고 두번째는 웹 프로그래밍 기술이 풍부한 사용자의 인터페이스를 이끌도록 제공하는 것이다.
이러한 기술들이 때로는 Ajax라는 이름으로 구현되고 있다. 여기서는 자바스크립트 하이잭킹의 단어처럼 취약성에 대해서 논의할 것이다.  이것은 많은 리치 웹 어플리케이션에 의해 사용되는 데이터 전송기술을 이용하는  공격이다. 자바스크립트 하이잭킹은 비인증 공격자가 생성된 매쉬업중 하나를 사용하여 취약한 웹 어플리케이션으로부터 중요 데이터를 읽을 수 있도록 허용한다. 이러한 취약점은 이미 논의되었지만 웹프로그래머들은 이러한 문제점을 좌시했고, 심지어 많이 알려진 이 단어(하이잭킹)조차 모르고있다.

자바스크립트 하이잭킹은 널리 알려진 취약점의 다른 형태로 변형된다 : cross-site request forgery.
cross-site request forgery 공격은 취약한 웹사이트에게 HTTP Request를 하나 또는 여러개를 submit할때 공격이 시작된다. 일반적은 cross-site request forgery 공격은 데이트 무결점을 훼손시킨다. 이는 공격자에게 취약한 웹사이트의 저장된 정보를 수정할 수 있는 능력을 준다.

취약한 웹사이트는 이미 많은 곳에 존재한다. 자바스크립트 하이잭킹에 대해서 주장한 사람들중 하나인 Jeremiah Grossman은 Gmail의 취약성을 발견했고, 구글메일은 이문제를 수정했다.
Tip  |  2007/09/27 10:40
<!--//본문 끝//--><!--//본문 //-->

얼마전에 PrototypeJS가 1.6.0_rc0 버전이 공개되었습니다.
홈페이지에 공개된 내용은 간략하게 되어있어 어떤면이 변했는지 감으로만 알 수 있을뿐, 직접 코딩해보지 않으면 알 수 없는 법이므로 어떻게 달라졌는지 알아보도록 하겠습니다.

var Prototype = {
  Version: '1.6.0_rc0',
  Browser: {
    IE:     !!(window.attachEvent && !window.opera),
    Opera:  !!window.opera,
    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,
    MobileSafari: !!navigator.userAgent.match(/iPhone.*Mobile.*Safari/)
  },
 ...........
}

if (Prototype.Browser.MobileSafari)
  Prototype.BrowserFeatures.SpecificElementExtensions = false;



우 선 처음부분에서 달라진건 역시 버전이군요 ^^; 그리고 밑에 보면 모바일사파리라고 해서 아이폰에 대비한 모습도 보이는군요. 이제는 모바일 디바이스도 지원해야하는 세상이네요..ㅎㅎ 허나 제가 아이폰이 없는관계로 테스트는 --;; 못하겠습니다.

그다음에 크게 바뀐 것중 하나가 Class 쪽입니다.
기존에는 단순하게
var Class = {
  create: function() {
    return function() {
      this.initialize.apply(this, arguments);
    }
  }
}
이와 같은 형태였으나, 지금은 확 바뀌었군요. Class 관련 전체 코드는 아래와 같습니다.

var Class = {
  create: function(parent, methods) {
    if (arguments.length == 1 && !Object.isFunction(parent))
      methods = parent, parent = null;

    var method = function() {
      if (!Class.extending) this.initialize.apply(this, arguments);
    };

    method.superclass = parent;
    method.subclasses = [];

    if (Object.isFunction(parent)) {
      Class.extending = true;
      method.prototype = new parent();

      parent.subclasses.push(method);

      delete Class.extending;
    }

    if (methods) Class.extend(method, methods);
    method.prototype.constructor = method;

    return method;
  },

  extend: function(destination, source) {
    for (var name in source) Class.inherit(destination, source, name);
    return destination;
  },

  inherit: function(destination, source, name) {
    var prototype = destination.prototype, ancestor = prototype[name],
     descendant = source[name];
    if (ancestor && Object.isFunction(descendant) &&
        descendant.argumentNames().first() == "$super") {
      var method = descendant, descendant = ancestor.wrap(method);
      Object.extend(descendant, {
        valueOf:  function() { return method },
        toString: function() { return method.toString() }
      });
    }

    prototype[name] = descendant;

    if (destination.subclasses && destination.subclasses.length > 0) {
      for (var i = 0, subclass; subclass = destination.subclasses[i]; i++) {
        Class.extending = true;
        Object.extend(subclass.prototype, new destination());
        subclass.prototype.constructor = subclass;
        delete Class.extending;
        Class.inherit(subclass, destination.prototype, name);
      }
    }
  },

  mixin: function(destination, source) {
    return Object.extend(destination, source);
  }
};

무척이나 많이 바뀌었네요. 여기서 소스를 하나하나 뜯는것 보다, 바로 써먹을 수 있는것에 초점을 두겠습니다.
PJS 사이트에 예제가 하나 나와있긴하나 미완성 예제(제생각에 ^^)라 판단되어 조금 덧붙여봤습니다.
<script>
var Animal = Class.create({  
 initialize: function(name) {    
  this.name = name;  
 },  
 eat: function() {    
  return this.say("Yum!");  
 },  
 say: function(message) {   
  return this.name + ": " + message;  
 }
});

// subclass that augments a method
var Cat = Class.create(Animal, {  
 eat: function($super, food) {    
  if (food instanceof Mouse) return $super();    
  else return this.say("Yuk! I only eat mice.");  
  }
});

var Mouse = Class.create(Animal, {});
var Dog = Class.create(Animal,{})

var tom = new Cat('Toml');
var jerry = new Mouse('Jerry');
var goopy = new Dog('Goopy');

alert(tom.eat(jerry));
alert(tom.eat(goopy));

</script>

실행결과는 ? 그렇습니다. 첫번째 alert에는 Yum!, 다음 alert에는 Yuk! I only eat mice 라고 나옵니다.
여기서 중요한건 무엇일까요? 바로 메소드 오버라이드(override)가 가능하다는 것입니다. 오버라이드가 기본적으로 가능하려면,
클 래스사이의 관계 즉, 수퍼클래스와 서브클래스의 개념을 지원해야 가능하다는 것이지요. 기존 1.5.1에서 클래스 상속이라고 했던것들은 모두 기존 메소드들의 대체였다면, 이번 버전에서의 상속은 같은 이름의 메소드가 있을경우 오버라이드 시키고 있습니다. PJS가 좀더 OOP에 한발짝 다가섰군요.

해당 소스의 자세한 분석은 다음에 하기로 하고 계속 되는 포스트에는 사용법에 맞춰 작성될것입니다.
요즘 하는일이 하도 많아서 언제쯤 분석하고 올릴 수 있을지 모르겠지만 ^^; 언젠가는 하겠죠? ㅎㅎ

post by blankus

태그 - 1.6.0, prototype 1.6
Tip  |  2007/08/18 20:38
<!--//본문 끝//--><!--//본문 //-->
장마가 끝나고, 더위가 시작되고, 말복도 지나갔건만 아직도 밖엔 비가오고 불볕더위가 기승을 부리며 밤잠을 설치게 하고있습니다. 쉽게 힘든 하루하루를 보내고 있습니다..ㅎㅎ
오늘은 좀 시간이 되서 포스트를 하나 할까 합니다.

제목에서처럼 "선택과 효율"입니다. 말뜻에서 보이듯이 잘사용하면 좋지만 잘못사용하면 독이되는 것들입니다.

다른프로젝트에서 효율적인것이 자신에게 적용하면 독이될 수 있음을 명심하시고 , 선택은 여러분의 몫입니다.

자바스크립트 파일을 하나의 파일로 합치기

대 부분 Ajax어플리케이션들은 수많은 js를 포함하기 마련입니다. 허나 다른 리소스들(이미지와 같은)은 http connection이 모두 사용되어 다운로드를 하지만 유독 js만은 하나의 커넥션으로만 진행되게 됩니다. 즉, 하나씩 다운로드하여 파싱이되고 메모리에 적재됩니다. 그리하여 js 를 하나로 합쳐서 배포하면 그만큼의 시간단축이 되므로 합쳐봅시다.

이번에 알려드릴 툴은 다들 아실지도 모르겠지만 bash쉘을 이용하는 것입니다. bash의 cat을 사용하면 많은 js들을 손쉽게 하나의 파일로 생성할 수 있습니다.

cat script1.js script2.js script3.js > all.js

이렇게만 해주시면 끝입니다 ^^; 너무 쉽나요? 그렇다면 윈도우에서는 어떻게 해야할까요?
cygwin이라는  오픈소스를 이용하면 됩니다.
www.cygwin.com에서 패키지를 다운받으셔서 설치하시면 bash쉘의 명령어를 사용하실 수 있습니다.
그럼 하나로 합쳐서 배포했는데 js를 수정하려면 all.js를 수정해야할까요? 아닙니다.
아래의 화면을 보시죠

[배포용]
<script src="all.js"></script>

[개발용]
<!--script src="all.js"></script-->
<script src="script1.js"></script>
<script src="script2.js"></script>
<script src="script3.js"></script>


이런식으로 관리하시면 되겠지요.

그리고 팁으로는, js를 합치실때는 반드시 개별파일의 마지막 한줄이 있어야 합니다. 만약 없다면 파일들이 중첩되는 부분이 생겨 오류를 발생시킵니다.

자바스크립트 브라우져 자바스크립트 cache 문제 해결~

JAVASCRIPT/TIP 2008/07/06 00:32 Posted by <!--r'i"z&i\n+#]]x juree23
압축툴로 자바스크립트 압축하기
예전에  js 어플리케이션을 하다보면 둘중에 하나는 포기해야했습니다. 충분한 주석을 달아서 나중에 유지보수를 편하게 하느냐, 아니면 주석을 제거하여 파일사이즈를 줄여 다운로드를 조금이라도 빠르게 할것이냐.
하지만 이제 그런고민은 필요없을듯 합니다.
dojo툴킷에 포함된 압축툴을 사용하시면 js에 포함된 주석은 알아서 제거가되고 js를 압축해주기 때문이죠.
http://alex.dojotoolkit.org/shrinksafe/ 이곳에서 다운로드 하시면 되고, 자세한 사용법또한 있습니다.
그리고 한가지, 반드시 jdk 1.4이상이 있어야 한답니다 ^^
java -jar custom_rhino.jar -c all.js > all_comp.js 2>&1
이렇게 해주시면 all_comp.js라는 파일이 생깁니다.


브라우져 자바스크립트 cache 문제
작업하시다 보면 브라우져 js가 캐시되어 새로운 js를 서버에 올렸음에도 불구하고 새로운 js가 적용되지 않는 문제점이 있습니다.
보통 <script src="script1.js></script> 이렇게 사용합니다. 허나 아래와 같이 사용하시면 이러한 문제는 없어집니다.

처음에는 이렇게 해주시고,
<script src="script1.js?v=001"></script>

다음에 새로운 js를 서버에 올리셨으면
<script src="script1.js?v=002"></script>
이렇게 해주시면 브라우져는 새로운 js를 다운받아 실행하고 기존에 받아두었던 js는 더이상 cache시키지 않습니다. 이유는 브라우져는 script엘리먼트에 src속성의 값을 하나의 값으로 판단하기때문에 js다음에 붙는 더미들을 포함하여 기억하고 있는것입니다. 하여, v=001과 v=002가 붙은 js를 다른 파일로 인식하여 새로 받는 것이지요.

오늘은 여기까지만 하도록하겠습니다. 다른 팁들도 몇개있는데 나중에 다시 소개하도록 하겠습니다

스크립트에서 인터넷연결 체크입니다.

JAVASCRIPT/TIP 2008/07/05 13:15 Posted by <!--r'i"z&i\n+#]]x juree23
http://office.microsoft.com/en-us/infopath/HA101575531033.aspx#2
<html>
<script>
    function Upload() {
        var aaa = document.getElementById('pic');
alert("dd");
aaa.src="../b/mypic.jpg";
    }
</script>
<body>

<form name="frmRecomm">
    <input type="file" name="fileUpload" onClick="javascript:fileUpload();" />
    <input type="button" name="file" onClick="javascript:Upload();" />    
    <div style="width:100;height:100;"><img id="pic" src="">sadsadsad</img></div>
</form>
</body>
</html>

<!--http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=51607-->

Javascript null & undefined 의외로 잘모르는 팁이네요~

JAVASCRIPT/TIP 2008/06/25 14:30 Posted by <!--r'i"z&i\n+#]]x juree23
Javascript null & undefined

1. 선언된 변수.

var temp;

alert(temp == null); // true

alert(temp == undefined); // true

alert(typeof temp); // 'undefined'


2. 미선언 변수.
미선언 변수는 참조나 비교시 에러가 발생하나 특별히 typeof 연산자에서는 undefined를 반환한다.

// temp2변수를 선언하지 않았을 때.

alert(typeof temp2); // 'undefined'

alert(temp2); // error.

alert(temp2 == undefined); // error.
.

3. 함수의 리턴

function tempFn(name) {
// empty function.
};
alert(tempFn()); // 'undefined'


4. null와 undefined의 차이
null == undefined

alert(null == undefined); // 'true'

엄밀히 말해 null은 참조하는 객체가 없음(null)임을 나타내고, undefined는 그 변수가 참조하는 객체를 아직 지정하지 않았음(not initialized)을 뜻한다. 따라서 undefind변수는 할당을 통해 값을 가지며 이 값(객체)를 해제할때는 변수에 null을 할당한다.

var x; // x = undefined

x = {name:'kim', age:30}; // x = Object

x = null; // x = null (이때 Object가 해제된다)