永远!不要在代码中用 User 这个词

论坛 期权论坛 期权     
码农那点事儿   2019-6-8 05:29   2180   0
码农那点事儿
关注我们,一起学习进步
转自:众成翻译,翻译:有马
www.zcfy.cc/article/never-use-the-word-user-in-your-code
当你意识到你在项目开始时做的轻量、简单的设想竟然完全错了时,你已经投入了六个月的时间在这个项目上。现在你需要解决这些问题,才能让这个系统继续运行下去,你发现你用在这个项目上的精力远远超出了你的预期,如果一开始就用正确的方式来做,就不会发生这样的事。

今天,我要告诉你的是一个经常犯的错误,一个会带来无穷无尽的问题的单词,那就是 User。

User 这个单词有 2 个最基本的错误:

  • 对你的需求来说,User 几乎从来都不是一个好的描述。
  • User 会导致一个基本的设计安全缺陷。

User 的概念是模糊不清的,使用更精准的术语几乎总是能起到更好的效果。

[h1]你没有使用者(User)[/h1]
最开始,没有任何一个软件系统真的有使用者存在。乍一看 User 是一个好的描述,但是你稍微一想就会意识到你的业务逻辑实际上比这要复杂的多。

我会使用三个例子,从一个极端的情况出发。

[h2]1、机票预订系统没有 User[/h2]
我曾经给机票预订系统写过访问控制逻辑,下面只是一小部分需求:

  • 旅客可以使用预定记录码通过网站查看预定信息。
  • 购买者可以通过信用卡号后四位数在网站上修改预订信息。
  • 旅行社可以查看和修改他们的预订。
  • 航空公司的值机人员可以根据角色和航空公司来查看和修改预订信息,这需要旅客提供身份信息。

不再一一列举。一些与人类相关的基本概念是“旅客”,“代理”(网站也可是看作代理)和“购买者”。Use 这个概念根本没用,并且在许多请求中我根本不会使用这个单词,举个例子,我们的请求必须包括旅客和代理人的证件,而不是使用者的证件。

[h2]2、Unix 没有 User[/h2]
我们看一个不太一样的例子。Unix (这些天被称为 POSIX)有用户,他们可以登录并执行代码。这样看起来很不错吧?我们深入看一下。

如果我们把所有都当作 User 的话,我们将会有:

  • 使用终端或者图形界面登录的人
  • 像邮件或者 Web 服务器这种系统服务也会以 User 的身份运行,例如 nginx 可以以 httpd 用户运行。
  • 在服务器上经常会有多人共享一个管理员账号用来SSH登录(例如,亚马逊的 Ubuntu 虚拟机默认 SSH 账号就是 ‘ubuntu’)
  • root 身份,和上面其他身份都不同。

上面四个是几乎不同的概念,但是在 POSIX 上他们都是 User。 一会儿我们就会看到,把这些概念都称为 User 会导致很多安全问题。

在操作上,因为 POSIX 的用户模型边界存在,我们甚至不能找到一种方式说「只能让 Alice 和 Bob 通过这个账号登录」。

[h2]3、SaaS 服务提供商没有 User[/h2]
Jeremy Green 最近就用户模型在 SaaS 中的应用在推特上发文,它第一次提醒了我写下这篇文章,他的基本观点是 SaaS 服务几乎总是:

  • 某个组织中的一个人支付服务费用。
  • 一个或多个人共同使用这个服务。

如果你一开始就把这些人作为一个用户,你将会陷入一个痛苦的世界。你无法建立团队模型,你无法组建同时为多人支付的模型,然后你就会开始改造你的系统。现在你在 SaaS 案例中学到了一课,我们来看一看你的生活。

但是这只是众多例子中的一个:User 的概念太模糊了。如果你开始怀疑 User 这个词,最终你可能发现你其实只需要两个概念:团队(用来组织关系和支付)和成员(实际使用服务的人)。

[h1]User 是一个安全问题[/h1]
User 这个单词不仅是业务逻辑的问题,它也导致了一系列安全问题。User 这个单词如此的模糊以至于从根本上将两个概念合并了:

  • 一个人。
  • 他们在软件中的代表性。

为了说明这个问题,假设你正在访问一个居心不良的网站,在它服务器上的图片导致了你的浏览器内存溢出。远程网站控制着你的浏览器,并且开始将你的文件上传到他的服务上。为什么它能这样做?

因为浏览器是以系统用户的身份运行的,它被认为与人类身份的你相同,实际上你们是不同的。 你作为 User,不想上传文件。但是系统的账号也是 User,能够上传文件,如果浏览器运行在你的账号之下,他所有的行为会被当作是你的意图,也就是说是你让它这么做的,实际上不是。

这就是被称为 Confused Deputy 的问题。如果你使用 User 这个词来描述两个根本不同的东西,那么这个问题就更有可能成为你设计的一部分。

[h1]前期设计的价值[/h1]
花更少的功夫处理相同的问题是成为高产程序员的关键。使用模糊不清的概念比如 User 来组织你的软件,将会花费大量时间和精力来解决未来发生的问题。一上来就开始编码看起来是高产的,事实恰好相反。

下次你开始一个新的软件项目时,请预先花几个小时确定你的术语和概念:虽然这么做你仍然不会完全正确,但你会做得更好。未来的你将感谢你现在所做的所有预防浪费的工作。


推荐阅读 ↓↓↓1.干货 | 绿色破解资源站分享
2.讲讲Python爬虫绕过登录的小技巧
3.这个月薪过万的岗位,为什么招不到人?

4.爆红GitHub!有人打算用这个项目100天拿下Python

5.如何使用Python批量压缩图片

6.一文读懂:从 Python 打包到 CLI 工具

7.谷歌出品|推出了史上最强的Python在线编辑器

8. 我猜你需要这个Python调试工具




● 后台回复【网页特效】,免费获取网页制作特效源码!  
● 后台回复【电子书】,免费获取python电子书、教程!
● 后台回复【面试】,免费获取110道python面试题!
推荐↓↓↓

码农那点事儿

你点的每个“在看”,我都认真当成了喜欢
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:35
帖子:7
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP