2015-12-29

Javascript 的 private property

前面提過,可以用 this 儲存 instance property,但是 instance property 完全沒有安全性可言
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,這樣會有一點點的效能耗損,不過結果是值得的。
---
---
---

沒有留言:

張貼留言