由于权限,用户无法通过 UI 导航到网页,但可以通过粘贴 URL 导航到页面。我该如何防范呢?

信息安全 Web应用程序 授权 权限
2021-08-31 07:56:26

在我的应用程序中,用户具有某些具有权限的角色。这些权限决定了他们在主屏幕上可以使用哪些 UI 元素。许多元素链接到其他页面,许多用户看不到这些页面,因为他们的权限不允许他们访问该网页。

例如,一个名为button1链接到应用程序中随机页面的按钮,比如说http://www.example.com/example.jsp. 然而,用户 John 具有不允许他查看的权限集button1因此约翰不能去http://www.example.com/example.jsp

我遇到的问题是,如果我以 John 的身份登录并粘贴该 URL,它会将我带到该页面。

显然,如果攻击者获取到管理员页面的 URL,这将带来巨大的安全风险。那么,我该如何防范呢?我是否需要验证每个页面的用户,检查权限并确保他们被允许在那里?

此应用程序中有数百个页面,在每个页面上都包含代码似乎非常多余且效率不高。有没有比我刚才提到的方法更简单的方法呢?

4个回答

我需要验证每个页面的用户吗?

绝对地。不仅是每个页面,还有对特权资源的每个请求,例如更新数据、删除、查看等的 POST 请求。这不仅仅是查看页面,还涉及控制谁可以在您的系统上执行什么操作。

听起来您的整个身份验证和权限系统在其当前实现中被破坏了。对于这个答案来说,解决这个问题的步骤太宽泛了。值得对该论坛和更广泛的网络进行一般搜索,以找到适合您的框架(JSP、ASP.Net、PHP 等)的解决方案。大多数框架都有开箱即用的功能来解决这个问题。

OWASP 的高级指南将是一个好的开始:操作安全:管理接口

正如你所收集的,快速的答案是肯定的。但它不需要是你正在考虑的巨大工作。(整个安全问题可能很大,但这只是其中的一部分)。你有比这更严重的问题。

为什么重要

你创造的任何东西都会受到试图破坏它的打击。有人会好奇。有人会做一些你意想不到的事情,这违背了你的想法。有人会好奇,或恶意,或爱管闲事。

您还应该理所当然地认为您的软件/网络应用程序通过自动化工具进行严格测试具有在线门户(几乎任何类型)的服务器在首次上线后的数十分钟内就会被黑客发现,并开始调查数千个可能的安全漏洞或疏忽中的任何一个。这意味着他们会探查“幕后”到底在运行什么,以及任何可检测到的漏洞(在数据验证、跨脚本验证、SQL 或二进制注入、JavaScript 黑客攻击、后端本身、什么弱点可能会通过迫使某些事情失败而出现,可以暴露哪些数据......)。

您的网络服务器通过数百甚至数千个自动化工具不断地以这种方式探测任何可能的网络代码和后端失误。这对人类和用户来说都是如此,而不是代替。

你宁愿这件事发生在很远的地方,并被批评者、媒体和愤怒的用户强烈地引起你的注意,还是导致责任?还是您更愿意修复它?

如何解决

从某种意义上说,这并不是一项艰巨的工作。您创建一个安全框架,然后每个页面导入或使用它。这样做的概念并不难,并且有据可查。所以页数不是什么大问题。

这份工作的难点在于安全是的。你真正的问题是,从这些问题存在并且你问这些问题的事实来看,你没有足够的知识来希望在没有帮助的情况下做到这一点。严重地。你。做。不是。

我不知道你有什么规模的团队或资源。你需要它——而且你可能没有希望在没有外界帮助的情况下做到这一点。

我真正关心的是

也就是说,我真正关心的不是网络应用程序。这是这个问题所暗示的心态。

想象一下,我正在考虑购买或使用您的应用程序。

显然,您认为安全性是事后才想到的,是对您工作的干扰或事后修复的不便,这并没有帮助或让读者放心(或者到目前为止您对它的理解不够充分) ,也许问题是真正基础的东西,比如正确编码按钮 URL。

安全你的工作,因为无论产品/服务在技术上多么出色,无论它的用户是谁,你真正的产品是信任和保证,你会满足我的需求而不会给我造成重大灾难。

我应该用我的数据信任你的应用程序吗?现在,我很抱歉这么说,我想我还不如自己在 Google+ 上发布它。是的,这是一种“那么糟糕”的情况和印象,不,这并没有夸大它的效果。

抱歉。

现在,如果您的应用程序很好,请让其他人参与进来。

您需要检查每个请求(GET、POST、PUT、DELETE)用户权限级别。浏览到一个页面,就像在你的情况下是一个 GET 请求。未经许可,用户也不能发布请求。

现在是否需要在应用程序的每个页面上添加代码取决于您的应用程序框架。例如,一些框架(Laravel、Express.JS)允许您对路由进行分组并对路由的每个请求应用过滤器,这就是您进行检查的地方。对于纯 PHP 的应用程序,您需要在每个页面上都有代码,您可以使用“include”语句来最小化整个代码块的重复。

之前已经说过,但是,是的,您应该在每个页面上验证您的用户凭据。例如,如果您的站点使用 PHP,最简单的方法是将登录用户及其权限级别保存在会话变量中,然后在代码开头验证这些会话变量。这些在注销时被擦除(如果您创建了注销逻辑来擦除这些变量)或会话超时(可以定义超时时间,但我认为默认值为 5 分钟不活动),因此未经授权的用户应该无法访问页面。其他技术将有类似的处理。

当我这么说时,我真的不是要听起来居高临下,所以我希望你不要从那种角度看待它,但这是一种基本的信息。如果您不知何故没有学习到这一点,或者在自学中没有遇到这一点,我强烈建议您注意这一点并更深入地阅读这个特定主题,因为它非常重要。对于任何类似的应用程序,您将一次又一次地这样做。

请注意,有多种方法可以简单有效地做到这一点,我给您的个人建议是在尝试使用框架。针对几种访问方法对其进行测试,一旦您满意,您可以查看各种框架如何执行用户会话处理。

编辑:我把它放在下面的评论中,但这实际上也是 OP 的一个很好的资源:https ://www.w3schools.com/php/php_sessions.asp