function User(account, password) {
this.account = account;
this.password = password;
}
var u = new User('Neil', 'yule');
console.log(u.account); // 可以讀到帳號
console.log(u.password); // 密碼走光了
u.password = 'yuching'; // 更慘,密碼被駭了
console.log(u.password);
那要怎麼保護密碼呢?不可以用 instance property 儲存敏感資料。先來看看 Javascript function 特性,從下面的例子,在 User 外面,也就是從 User instance 是拿不到 password 和 secret 的。
function User(account, password) {
this.account = account;
// this.password = password;
var secret = 'yule'; // 外面看不到 password 和 secret
}
var u = new User('Neil', 'yule');
console.log(u.password); // undefined
console.log(u.secret); // undefined
所以不要將敏感資料掛在 this 上,基本上就安全了!
但是要怎麼使用敏感資料呢?
這可以分成兩部份,第一是讀取且為唯讀,也就是說可以讀不能改,第二是計算或修改,但得在受保護的情況下進行。
以上兩點都可以用 closure 辦到。
讀取且為唯讀。
function User(account, password) {
this.account = account;
this.getPassword = function() {
return password;
};
}
var u = new User('Neil', 'yule');
console.log(u.getPassword()); // 可以讀到密碼,但無法竄改
計算,在受保護的情況下進行。function User(account, password) {
this.account = account;
this.checkPassword = function(newPassword) {
return newPassword == password;
};
}
var u = new User('Neil', 'yule');
console.log(u.checkPassword('yule')); // true
console.log(u.checkPassword('yuching')); // false
修改,在受保護的情況下進行。function User(account, password) {
this.account = account;
this.checkPassword = function(newPassword) {
return newPassword == password;
};
this.changePassword = function(newPassword) {
// do some check
password = newPassword;
};
}
var u = new User('Neil', 'yule');
console.log(u.checkPassword('yule')); // true
u.changePassword('yuching');
console.log(u.checkPassword('yuching')); // true
雖然使用 closure 可以實做出 private property 的效果,但有一個小小的缺點,就是不能用 prototype method(請參考 Javascript 的 prototype),只能在 function 裡用 this 定義 instance method,這樣會有一點點的效能耗損,不過結果是值得的。---
---
---
沒有留言:
張貼留言