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,這樣會有一點點的效能耗損,不過結果是值得的。
---
---
---
沒有留言:
張貼留言