当前位置: 首页 > 科技观察

永远不要在你的代码中使用“用户”这个词

时间:2023-03-17 22:42:01 科技观察

【.com快速翻译】你已经在一个项目上工作了六个月,突然你意识到你一开始所做的一个小而简单的假设是完全错误的。现在您需要解决问题,同时保持现有系统正常运行;不用说,这比一开始就把它做好要付出更多的努力。今天我要告诉大家一个常犯的错误,就是一句话,就会惹来无穷无尽的麻烦。我指的是“用户”这个词。这个词有两个基本问题:1.“用户”几乎从来都不是对您需求的良好描述。2.“用户”造成了基本的安全设计缺陷。“用户”的概念是模糊的,我建议你使用更精确的术语。你没有用户首先,没有软件系统实际上有“用户”。乍一看,“用户”是一个很好的描述,但仔细分析之后,你会发现你的业务逻辑其实更复杂。我们将考虑三个例子,从一个极端的例子开始。航空公司预订系统没有“用户”我曾经为航空公司预订系统开发访问控制逻辑。以下是一小部分要求:如果乘客有预订编号(PNR),则可以通过网站查看预订。如果购票者有信用卡号的最后4位数字,则可以通过网站修改预订。旅行社可以查看和修改通过他们的旅行社进行的预订。有了乘客的身份信息,航空公司登机代理可以根据他们的角色和机场查看和修改预订。等等。人员对应的几个基本概念是“旅客”、“代理人”(网站也可以是代理人)和“购票人”。“用户”这个概念根本没用,我们根本不用这个词——例如,在很多请求中,我们希望包含乘客和代理人的登录信息(凭据)。Unix没有“用户”,所以看一个完全不同的情况。Unix(现在称为POSIX)有用户:用户可以登录并运行代码。这看起来不错,不是吗?但仔细看看。如果我们实际上经历了所谓的用户活动,我们有:人们通过终端或GUI登录。还有一些系统服务(例如邮件或网络服务器)以“用户”身份运行,例如nginx可能以httpd用户身份运行。在服务器上,通常会有多个人共享管理帐户,这些人使用该“用户”进行SSH连接(例如,ubuntu是运行Ubuntu的AWS虚拟机上的默认SSH帐户)。根,与上述任何一个都不完全相同。这是四个截然不同的概念,但在POSIX中它们都被称为“用户”。正如我们稍后将看到的,将所有这些概念与模糊的“用户”概念混为一谈会导致许多安全问题。但实际上,我们甚至没有办法在POSIX用户模式的边界内说“只有Alice和Bob可以登录共享管理员帐户”。SaaS提供商没有“用户”JeremyGreen最近在推特上发布了关于服务中的用户模式??(SaaS)软件的推文,这促使我写了这篇文章。他的基本观点是SaaS服务几乎总是有:组织中有人为服务付费。业务组织内实际使用服务的一名或多名人员。如果您首先将这些人合并为一个“用户”,您将陷入痛苦的深渊。你不能为团队建模,不能同时为多人建模支出,现在你需要转换系统。但这只是一个更广泛问题的一个例子:“用户”的概念太模糊了。如果您一开始对“用户”这个词持怀疑态度,您很可能最终会意识到您实际上至少有两个概念:团队(支付费用并拥有所有权的单位)和团队成员(人员)谁实际使用该服务)。“用户”是一个安全问题“用户”这个词不仅仅是业务逻辑的问题:它具有严重的安全后果。“用户”这个词太过模糊,混淆了两个完全不同的概念:人。一个人在软件中的表现。要了解为什么这是一个问题,假设您访问了一个恶意网站,该网站托管了一张利用浏览器缓冲区溢出的图像。远程站点现在控制了您的浏览器并开始将您的所有文件上传到其服务器。为什么要这样做?因为您的浏览器作为操作系统的“用户”运行,本应与您相同,而实际上您是完全不同的“用户”。您,用户,不想上传这些文件。操作系统帐户(也是用户)可以上传这些文件,并且由于您的浏览器在您的用户下运行,因此假定其所有操作都是您打算执行的操作。这就是所谓的混淆代理问题。如果您使用“用户”一词来描述两个根本不同的事物是同一件事,那么这个问题很可能是您设计的一部分。预先设计的重要性成为高效程序员的关键是以更少的努力完成同样的工作。使用诸如“用户”之类的模糊术语对软件进行建模需要花费大量时间和精力在以后进行修复。立即开始编码似乎很有成效,但事实恰恰相反。下次你开始一个新的软件项目时,花几个小时预先确定术语和概念:你仍然不会完全正确,但结果会好得多。将来你会庆幸自己避免了各种非生产性的劳动。原标题:永远不要在你的代码中使用“用户”这个词,作者:ItamarTurner-Trauring