写代码注意了,打死都不要用 User 这个单词

简介: 当你意识到你在项目开始时做的轻量、简单的设想竟然完全错了时,你已经用了六个月的时间投入到这个项目上。

当你意识到你在项目开始时做的轻量、简单的设想竟然完全错了时,你已经用了六个月的时间投入到这个项目上。


现在你需要解决这些问题,才能让这个系统继续运行下去,你发现你用在这个项目上的精力远远超出了你的预期,如果一开始就用正确的方式来做,就不会发生这样的事。


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


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


1、对你的需求来说 “User” 几乎从来都不是一个好的描述。


2、“User” 会导致一个基本的设计安全缺陷。


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


你没有使用者

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


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


机票预订系统没有“users”

我曾经给机票预订系统写过访问控制逻辑,下面只是一小部分需求:


旅客可以使用预定记录码通过网站查看预定信息。


购买者可以通过信用卡号后四位数在网站上修改预订信息。


旅行社可以查看和修改他们的预订。


航空公司的值机人员可以根据角色和航空公司来查看和修改预订信息,这需要旅客提供身份信息。


不再一一列举。一些与人类相关的基本概念是“旅客”,“代理”(网站也可是看作代理)和“购买者”。


“user”这个概念根本没用,并且在许多请求中我根本不会使用这个单词,举个例子,我们的请求必须包括旅客和代理人的证件,而不是使用者的证件。


Unix 没有 “users”

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


如果我们把所有都当作“users”的话,我们将会有:使用终端或者图形界面登录的人


像邮件或者web服务器这种系统服务也会以“users”的身份运行,例如nginx可以以httpd用户运行。


在服务器上经常会有多人共享一个管理员账号用来SSH登录(例如,亚马逊的Ubuntu虚拟机默认SSH账号就是‘ubuntu’)


root 身份,和上面其他身份都不同。


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


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


SaaS 服务提供商没有 “users”

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


1、某个组织中的一个人支付服务费用。


2、一个或多个人共同使用这个服务。


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


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


“Users” 是一个安全问题

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


一个人。


他们在软件中的代表性。


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


因为浏览器是以系统用户的身份运行的,它被认为与人类身份的你相同,实际上你们是不同的。


你作为’user’,不想上传文件。但是系统的账号也是‘user’,能够上传文件,如果浏览器运行在你的账号之下,他所有的行为会被当作是你的意图,也就是说是你让它这么做的,实际上不是。


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


前期设计的价值

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


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


相关文章
|
9月前
|
消息中间件 大数据 Kafka
掌握大数据时代的心跳:实时数据处理的崛起
掌握大数据时代的心跳:实时数据处理的崛起
350 4
|
9月前
|
自然语言处理 专有云 调度
从问答到决策,三步构建电网智慧大脑
从问答到决策,三步构建电网智慧大脑
|
11月前
|
存储 缓存 运维
“网”罗天下,一键搞定:netsh命令的花式玩法与超实用攻略
`netsh`是Windows系统中强大的网络配置和管理工具,支持本地或远程修改网络设置。常用功能包括:显示和配置网络接口、无线网络管理、防火墙规则设置、网络配置备份与还原、远程管理等。通过`netsh`命令,用户可以轻松管理IP地址、启用/禁用网络接口、添加或删除无线网络配置文件、配置防火墙规则,并进行网络故障排查。掌握这些命令能大幅提升网络管理和维护效率。
1221 11
|
数据采集 Web App开发 数据处理
一步步教你用Python Selenium抓取动态网页任意行数据
使用Python Selenium爬取动态网页,结合代理IP提升抓取效率。安装Selenium,配置代理(如亿牛云),设置User-Agent和Cookies以模拟用户行为。示例代码展示如何使用XPath提取表格数据,处理异常,并通过隐式等待确保页面加载完成。代理、模拟浏览器行为和正确配置增强爬虫性能和成功率。
2026 3
一步步教你用Python Selenium抓取动态网页任意行数据
|
人工智能 算法 计算机视觉
极智AI | 目标检测实现分享一:详解YOLOv1算法实现
大家好,我是极智视界,本文详细介绍一下 YOLOv1 算法的设计与实现,包括训练。
822 0
|
机器学习/深度学习 数据采集 算法
数学建模(三):预测
在数学建模比赛中,预测也是我们最常见的问题之一,特别是每年的国赛C题,C题不出意外都为统计题。博主在去年的国赛C题和今年的长三角数学建模中都有遇到预测类的题目,在预测类问题中时间预测和多指标预测最为常见,接下来就详细讲一下如何利用BP神经网络去解决该类问题
数学建模(三):预测
|
SQL 监控 安全
【网络安全】护网系列-护网安全设备
【网络安全】护网系列-护网安全设备
974 0
|
Java Windows
Java jar打包成exe应用程序
Java jar打包成exe应用程序
1661 0
|
数据采集 人工智能 搜索推荐
《多场景智能推荐方案及实操演示》|学习笔记
快速学习《多场景智能推荐方案及实操演示》
255 0
|
Python
Python 中的条件判断、循环以及循环的终止
Python 中的条件判断、循环以及循环的终止
424 0
Python 中的条件判断、循环以及循环的终止