ES7:漆黑的 “Whitelist” 和 “Blacklist” 之争
在前端开发中,我们经常会遭遇 “Whitelist” 和 “Blacklist” 的问题。这两个词汇很容易被理解为白名单和黑名单,但实际上,它们的意义可能与我们一开始想的不太一样。
在此,我们来一起看看这个分歧,并且探讨 ES7 带来的新特性,目的是让开发者更好地使用这两个常用的概念。
什么是白名单和黑名单?
在计算机科学中,白名单是被允许的项的列表,而黑名单是被禁止的项的列表。例如,在 Web 开发中,“Whitelist” 可以是指只允许访问特定域的网站或只允许使用特定集合的字符或标记。反之,“Blacklist” 可以是指禁止访问特定网站或禁止使用特定类别的字符或标记。
然而,在不同的情况下, “Whitelist” 和 “Blacklist”的定义也会发生变化。某些情况下,“Whitelist”可能是指允许进行特定操作的“好”对象,即可靠和受信任的程序,而“Blacklist”可能是指需要被检测和阻止的“坏”对象,即恶意软件,垃圾邮件等等。
这两个术语在安全性和权限控制上起着重要的作用。
ES7 中的 “Whitelist” 和 “Blacklist”
ES7 引入了一些新的特性,旨在根据上下文,将 “Whitelist” 和 “Blacklist” 相对于其正对应的情况进行分类。
对于 “Whitelist”,新的特性是使它更加明确。在 ES7 中, Javascript 通过使用 Object.seal() 和 Object.freeze() 方法来为来确定哪些属性可以被修改和重新分配,哪些属性会被保留作为只读。比如:
let obj = { a: 1, b: 2 }; Object.freeze(obj); obj.a = 3; // 无效操作 console.log(obj.a); // 仍然是1
在这个例子中,因为 Object.freeze() 方法防止属性被修改,做到了“Whitelist”的效果。
另一方面,ES7 中的 “Blacklist” 特性是更为抽象。实现它需要让开发者更好地了解上下文并使用他们自己的判断力来进行筛选。例如,在我们想要删除对象的某个键时,使用 Reflect 和 Proxy 就可以实现有针对性的例程,对基于特定操作的查询进行拦截,从而实现“Blacklist”的效果。
下面是一段使用 Proxy 例程删除特定键的示例代码:
let obj = { a: 1, b: 2, c: 3, d: 4 };
let handler = {
deleteProperty(target, key) {
if (key.startsWith('a') || key.endsWith('d')) {
throw new Error(删除属性 ${key} 不安全
)
}
delete target[key];
}
};
let proxy = new Proxy(obj, handler);
delete proxy.b; console.log(proxy); // { a: 1, c: 3 }
// 抛出异常 delete proxy.a; // Error: 删除属性 a 不安全
在这个例子中, deleteProperty() 方法拦截了所有的删除操作,并用自定义的操作进行了检测。
结论
在 ES7 中,“Whitelist” 和 “Blacklist” 的概念有了更加明确和抽象的定义,这对于开发者在代码中的权限控制方面起到了更加准确和实用的作用。
在编写代码时,需要好好考虑上下文,选择合适的上述方法,从而使代码更加安全和可读。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6720b1002e7021665e037d2d