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

例如,名为button1的按钮链接到其他页面。应用程序,例如http://www.example.com/example.jsp。但是,用户John的权限设置不允许他查看button1。因此,John无法访问http://www.example.com/example.jsp。 br />例如,如果攻击者获得了指向管理员页面的URL,那么显然这会带来巨大的安全风险。那么,我该如何防范呢?我需要验证每个页面的用户,检查权限并确保允许它们存在吗?为此,请在每个页面上添加代码。有没有比我刚才提到的方法更简单的方法?

评论

@Michael如果在每个页面上执行代码实际上需要分别修改每个页面,则您可能还会在做其他错误的事情。如果您没有针对站点范围的安全性和完整性检查的准备,则应尽快添加它,而不是以后添加。开发人员是否接受过安全培训?这里到处都是危险信号,修复找到的内容将使未找到的内容保持不变。

是的,每个页面,每个破坏性操作以及每个公开私有数据的操作。您在这里拥有的被称为“跨领域关注点”

权限不应该只隐藏UI元素来强制执行;),但有了答案,我想您现在已经了解了

我总是尝试更改URL ust来获得乐趣。当只有enable.php时,请尝试使用disable.php。

我还没有阅读任何答案中的魔术字。做。不。相信。输入。曾经..

#1 楼


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


绝对。不仅每个页面,而且对特权资源的每个请求,例如对更新数据,删除,查看等的POST请求。这不仅与查看页面有关,还与控制谁可以在系统上执行操作有关。 br />
听起来您的整个身份验证和权限系统在当前的实现中都被破坏了。解决这个问题的步骤对于这个答案来说太宽泛了。值得对该论坛和更广泛的网络进行一般搜索,以找到适合您的框架的解决方案(JSP,ASP.Net,PHP等)。大多数框架具有解决此问题的即用型功能。

OWASP的这份高级指南是一个好的开始:操作安全性:管理界面。

评论


我只想重申一下,因为在OP阶段您的回答并非一件小事:是的,这绝对是正确且唯一的答案。每个页面都必须正确执行安全规则。听起来当前存在的只是客户端安全性,实际上它不提供任何安全性。有多种方法可以编写代码,以便您可以轻松地在每个页面上应用安全性,但是没有答案不涉及对每个单独的请求强制执行安全性。否则,您将没有任何安全性。

– Conor Mancone
17-10-10在17:03

请注意:AJAX请求也是请求,应进行验证。无关紧要的是,该特定的AJAX请求仅应发生在已验证用户的页面上。我知道答案属于“每个请求”。确保OP也知道这一点。

–Mołot
17-10-11在0:47

还有一点:此检查必须在服务器上完成-而不是通过在客户端上运行(或不运行)的javascript代码进行。恶意用户可以避免运行javascript代码。

–马丁·邦纳(Martin Bonner)支持莫妮卡(Monica)
17-10-11在12:17

最后:使用javascript隐藏用户无权访问的链接很好-但这是拥有一个不错的UI而不是安全性的问题。

–马丁·邦纳(Martin Bonner)支持莫妮卡(Monica)
17-10-11在12:18

@MartinBonner完全同意您的意见,但是总的来说,安全性是关于层次的。虽然隐藏链接当然不是安全的,但它可以提供帮助。如果在安全检查中某处存在错误,则不具有链接仍然会增加一些内容,因此我也宁愿不首先将数据发送给客户端。 (我将其视为另一层)。

– kap
17-10-12在11:56

#2 楼

快速的答案是肯定的。但这并不一定是您正在考虑的繁琐工作。 (整个安全性可能很大,但这只是其中一部分)。您所面临的问题远不止于此。有人会很好奇。某人会做您未曾预料到的事情,而这违背了您的想法。有人会好奇,恶意或流鼻涕。

您还应该理会您的软件/网络应用将通过自动化工具进行严格测试。拥有在线门户(几乎所有类型)的服务器在首次上线后的几十分钟内就被黑客发现,并开始针对数千种可能的安全漏洞或疏忽中的任何一种进行探测。这意味着他们将探查“幕后”究竟在运行什么,以及可被利用的任何可检测到的失误(在数据验证,跨脚本验证,SQL或二进制注入,JavaScript hacking,后端本身,什么?强迫某些事情失败,暴露哪些数据可能会导致漏洞...)。

将通过数百种(即使不是数千种)自动化工具来不断地以这种方式探测您的Web服务器是否存在任何可能的Web代码和后端失效。人类和用户一样,而不是人类。

您是想走这条路吗?批评者,媒体和愤怒的用户有力地引起了您的注意,还是导致了责任?还是您想修复它?

如何解决它

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

工作的难点是安全性很难。您真正的问题是,由于存在这些问题并且您正在问这些问题,因此您没有足够的希望没有帮助就这样做。说真的您。做。不是。

我不知道您拥有多少规模的团队或资源。您需要它-在没有外部帮助的情况下,您可能没有希望做这件事。网络应用。这是这个问题所建议的心态。

想象一下我正在考虑购买或使用您的应用。这是事后的想法,是对工作的干扰或事后的不便修复(或者到目前为止,您对这种方法的理解还不够深入),也许问题出在真正的基础上,例如编码按钮正确地设置URL。重大灾难。

我应该用我的数据信任您的应用?现在,很抱歉,我想我也可以将其发布在Google+上。是的,这是一种“糟糕”的情况和印象,而且这并没有夸大其效。好,请其他人参与。

评论


后者似乎建议客户根据安全性来决定产品。除了在某些非常非常具体的领域中,这是不正确的,而且从业务PoV角度来看,花太多钱来满足非功能性需求(如启动安全性)是一个可怕的想法。是的,这里的每个人都讨厌这种心态,但简单的事实仍然是用户不关心安全性,即使他们做到了,他们也无法判断什么是安全的,什么不是安全的(不要相信吗? WhatsApp的TextSecure / Signal用户号)

– Voo
17-10-16在18:21

您正在考虑预先。最初不是,不是。但是,一旦知道一个重大问题-是的。一旦获得评论-是的。一旦社交媒体开始获得超过一两个人的评论,例如“发生了什么以及它如何发生”。人们并没有积极地寻求安全性,但是他们确实会考虑评论和公共知识(如果有的话),而且还会有一段时间。 (我确实同意,如果他们先看会更好,但是如果它是一个主要问题(如操作说明所述),它将很快就可以看到-大约是什么时候弄砸了,有人发怒地张贴了它)

– Stilez
17-10-17在3:36



#3 楼

您需要检查每个请求(GET,POST,PUT,DELETE)的用户权限级别。浏览到页面,例如您的情况是GET请求。未经许可,用户也不应发布请求。

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

评论


HEAD或其他任何怪异的HTTP方法(当然,除非您总是阻止它们)。

– jpmc26
17-10-11在19:13



#4 楼

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

我说这句话并不是真的要屈尊,所以希望您不要这么认为,但这有点儿麻烦信息。如果您在自学过程中以某种方式没有学习到此内容,或者没有遇到过这个问题,我强烈建议您注意这一点,并深入阅读该特定主题,因为它非常重要。您将一次又一次地为任何类似的应用程序进行此操作。

请注意,有多种方法可以简单有效地完成此任务,我个人的建议是按照您自己的逻辑进行编码,以便您完全理解在尝试使用框架之前,它可以工作。针对多种访问方法进行测试,一旦感到满意,您就可以研究各种框架如何执行用户会话处理。

编辑:我在下面的评论中对此进行了评论,但这实际上也是OP的良好资源:https://www.w3schools.com/php/php_sessions.asp

评论


PHP为这些会话变量提供哪些安全保证?它们是否存储在客户端计算机上?如果不是,客户端如何识别其会话?客户端数据是否已加密?是否有防止共享客户端数据的保护措施?

– jpmc26
17-10-11在19:25

以下是有关PHP会话的快速简单说明:w3schools.com/php/php_sessions.asp。信息和会话变量不存储在客户端,仅存储在服务器端。服务器向客户端提供密钥。该密钥用于标识用户当前正在参加的会话。

– psosuna
17-10-11在20:48



@ jpmc26还有一个例外:PHP =超文本预处理器。这意味着PHP代码在服务器端运行。它在HTML之前执行,因此有很多东西不需要传输到用户的机器上。这就是为什么PHP是进行身份验证的好选择的原因,因为可以在将响应发送回客户端之前验证输入数据。

– psosuna
17-10-11在20:59



哦,我对PHP作为服务器端技术非常熟悉。 (我在Web应用程序上谋生,而PHP则不是。)但是,我知道必须在客户端存储一些东西才能使用户会话可识别。因此,我想知道有关此数据是否已加密以及您拥有什么的信息(用于防止会话劫持或有意与其他用户共享密钥)。例如,请参阅此批评。不过,我不知道在过去5年中某些情况是否发生了变化。

– jpmc26
17-10-11在22:52



@ jpmc26我认为批评的针对性很差:这是关于共享服务器的配置不正确,以便用户可以访问彼此的数据。答案不是加密,而是将会话放在其他用户无法访问的目录中。如果没有这样的目录,他们仍然可以访问您的解密密钥。它也与会话劫持无关,它通常描述了攻击者在客户端窃取会话标识符。加密也无济于事。

–IMSoP
17-10-12在14:14



#5 楼

无论用户键入地址还是单击链接,用户都不能导航到该页面。

您的问题的通用解决方案是使用基于角色的访问控制(RBAC)方法。创建不同的组,并将具有相同特权的用户分配给相应的组。同样,将网页和其他资源分组到不同的文件夹中;每个由特定组拥有。我使用chgrp(更改组)在运行带有轻量级Web服务器的嵌入式Linux的系统上实现了这一目标。在Apache Web服务器中,可以通过放置.htaccess文件并拒绝访问(如堆栈溢出中所述)来实现相同目的。

对于UI元素,您将创建不同的页面(或通过组检查隐藏元素)。您将需要标识用户(登录他们并确定他们对应的组),然后根据用户的权限显示网页。

#6 楼

只是关于实现的一个快速建议,因为您对100页的页面有些担心。例如,在ASP.NET MVC中,您可以创建一个全局过滤器或一个“其他”页面都可以继承的“基本”页面。

然后,位于中央的代码可以检查用户上下文/会话并将其与当前页面的权限/许可/或组成员身份列表进行比较(可能是每个页面上的数据结构或基于页面名称的数据库查找等)。

#7 楼

其他答案非常笼统,因此我将其添加,因为提到了JSP页面,因此我认为我可以假设您正在使用Java。每次向应用程序发出请求时执行的代码。如果使用像Spring这样的安全框架,则可以配置可以由谁访问的URL。