我们有一个Web应用程序,包括Web层(PHP),应用层(Java)和DB(mysql)。 web-tier与app-tier和DB通信以检索一些数据。 我们的一位客户坚持将每个层与防火墙分开,并阻止从Web层到数据库的流量。他们声称这是不安全的,并且应用程序层需要具有将由Web层使用的“获取数据”功能,而不是直接从数据库读取数据。
当数据直接从数据库中通过Web层轻松访问时,通过应用层传输数据似乎是一种真正的浪费。只读数据可以来自高度优化的视图,并且可以按原样显示。这极大地简化了设计并消除了诸如分页之类的其他问题。 该技术称为Fast-Lane-Reader,主张直接从DB检索表格只读数据。对于更新,app-tier用于应用业务规则的地方。
所以我的问题是这个3层防火墙隔离拓扑是否可以调整并允许从Web到数据库层的直接流量?
提前致谢, Philopator。
答案 0 :(得分:1)
我不太确定我是否购买了整个安全角度,但我认为限制/消除表示层(Web应用程序)和数据层(数据库)之间的直接聊天是明智的,以明确界定顾虑。
首先,它鼓励代码重用和封装业务逻辑,而不是在整个应用程序中传播它。例如,如果您有多个前端(桌面,Web,移动),那么逻辑重复将被最小化。
其次,它有助于将来证明您的应用程序。例如,如果您从PHP迁移到ASP.NET或移动操作系统前端,它将最大限度地减少相关部分所涉及的工作以显示数据。
总而言之,无论如何,这可能是一个好主意。如果在安全架构方面有一些好处。奖金。
答案 1 :(得分:1)
我建议你向客户解释如何定义“价值”并让他们向你解释他们如何定义它。我的猜测是你不在同一页上。听起来你重视fast and cheep over quality(设计)。您的客户是否同意这种方法?听起来他们更关心的是设计质量而不是快速和吱吱声。如果是这种情况,我会听你的客户(因为他们付钱给你, - 他们应该愿意支付这个质量)。也许在谈到定义价值之后,您的客户会以您的方式看待它。也许不是。
有充分的理由 - 即可维护性和可扩展性 - 使PHP层远离数据库层(并且只通过Java中间层访问数据)。
想想可维护性的原因:
诸如Java层之类的中间层充当facade。数据库模式可以随时更改(无论出于何种原因),并且您的PHP层不需要关心它(这意味着您不需要更新PHP代码中的任何内容)。只需要更新Java层。 Java层维护一致的接口(用于编写PHP代码)。
现在,如果在Java和PHP层直接访问它时更改数据库模式,则必须更新两个层。这是一个脆弱的设计(维护噩梦),如果你不负责Java应用程序层和PHP层,那就特别糟糕。
答案 2 :(得分:0)
Philopator,我想说的不是防火墙阻止FrontEnd(PHP)和DataLayer(MySql)之间的通信,即使没有任何防火墙,通常也不会有直接链接UI - >数据库中。
在你的情况下,你甚至用Java完成了一个很好的中间层,我肯定会通过java层遍历所有内容,以便完全解耦UI和数据库。
在性能问题上不要害怕通常没有或者可以解决,我认为你可以做所有事情,如访问视图或存储过程,分页排序等等从java组件开始调用而不是PHP表示层。
答案 3 :(得分:0)
要通过应用层提供真实世界的“今天校对”优势,请将其视为封装。您应该只有一种设置/获取特定数据的方法,因为您只需要在一个地方进行验证/格式化/过滤。
想象一下,您的java代码中有一个WidgetService.addWidget()服务方法。您希望确保所有窗口小部件都是允许当前用户使用的类型,因此addWidget()会检查其权限。现在,如果您的PHP代码尝试直接将数据库添加到数据库,它将绕过这些检查。