安全访问

简介: 安全访问

考虑如下的情景:我们想确认在指定的库中是否存在某个函数。如果我们确定这个库确实存在,那么可以直接使用 if lib.foo then ... ;否则,就得使用形如 if lib and lib.foo then ... 的表达式。


当表的嵌套深度变得比较深时,这种写法就会很容易出错,例如:

zip = company and company.director and company.director.address and company.director.address.zipcode点击复制复制失败已复制


这种写法不仅冗长而且低效,该写法在一次成功的访问中对表进行了 6 次访问而非 3 次访问。


对于这种情况,诸如 C# 的一些编程语言提供了一种安全访问操作符(safe navigation operator)。在 C# 中,这种安全访问操作符被记为 ?. 。例如:对于表达式 a?.b ,当 anil 时,其结果为 nil 而不会产生异常。使用这种操作符,可以将上例改写为:

zip = company?.director?.address?.zipcode


如果上述的成员访问过程中出现 nil ,安全访问操作符会正确的处理 nil 并最终返回 nil


Lua 语言并没有提供安全访问操作符,并且认为也不应该提供这种操作符。一方面, Lua 语言在设计上力求简单;另一方面,这种操作符也是非常有争议的,很多人就无理由地认为该操作符容易导致无意的编程错误。不过,我们可以使用其他语句在 Lua 语言中模拟安全访问操作符。


对于表达式 a or {} ,当 anil 时其结果是一个空表。因此,对于表达式 (a or {}).b ,当 anil 时其结果也同样时 nil ,这样,我们就可以将之前的例子重写为:

zip = (((company or {}).director or {}).address or {}).zipcode


在进一步,我们还可以写的更短和更高效:

E = {}      -- 可以在其他类似表达式中复用
...
zip = (((company or E).director or E).address or E).zipcode


确实,上述的语法比安全访问操作符更加复杂。不过尽管如此,表中的每一个字段名都只被使用了一次,从而保证了尽可能少地对表进行访问;同时,还避免了向语言中引入新的操作符。

目录
相关文章
|
存储 安全 算法
一文理解UDS安全访问服务(0x27)
一文理解UDS安全访问服务(0x27)
一文理解UDS安全访问服务(0x27)
|
2月前
|
安全 数据安全/隐私保护
|
2月前
|
安全 定位技术 网络安全
安全策略中的访问策略
【8月更文挑战第11天】
44 3
|
2月前
|
监控 安全 数据安全/隐私保护
什么是访问控制服务?
【8月更文挑战第31天】
39 0
|
2月前
|
安全 Linux 网络安全
思科接入点支持的身份验证机制
【8月更文挑战第24天】
31 0
|
5月前
|
存储 安全 数据库
InfluxDB安全机制:用户认证与访问控制
【4月更文挑战第30天】InfluxDB的安全机制聚焦于用户认证和访问控制,包括启用默认禁用的用户认证,创建和管理加密密码的用户,以及实施细粒度的权限和角色管理。建议启用认证、设置强密码,合理分配权限,定期更新和审计,以及使用HTTPS确保数据传输安全,以增强数据库安全性。
|
存储 安全 测试技术
【应用安全】什么是细粒度访问控制?(以及为什么如此重要)
确定谁可以和不能访问某些数据的最传统方法之一是一个称为基于角色的访问控制(RBAC)的框架。此方法定义公司内的特定用户角色,然后为每个角色指定权限。
|
安全 API 数据安全/隐私保护
【应用安全】什么是基于属性的访问控制(ABAC)?
基于属性的访问控制(ABAC)是一种授权模型,它评估属性(或特征),而不是角色,以确定访问。ABAC的目的是保护数据、网络设备和IT资源等对象免受未经授权的用户和操作的影响,这些用户和操作不具有组织安全策略定义的“批准”特征。
|
弹性计算 负载均衡 网络协议
这才是云资源访问控制该有的样子
别误会,是指内勤小白也能用的明白
887 0
这才是云资源访问控制该有的样子
|
安全 Java API
"朕亦甚想你"——从后宫管理看阿里云访问控制(上)
本文从后宫切入,类比简述了阿里云访问控制(RAM)的概念。对用户授权、角色扮演给出详细的操作方法。然后以OSS为例,详细说明了权限问题的排除方法。本文的目的是让读者快速熟悉RAM、快速上手、快速解决遇到的问题。
14392 0