我在D2010中使用ADO和devexpress构建了一个广泛的2层应用程序。我想将此升级为使用Datasnap主要是为易受攻击的SQL服务器提供HTTPS通信而不仅仅是TCP / IP。我已经按照我能找到的所有Datasnap教程进行了操作。我有Cary Jensen的深度Delphi:ClientDatasets。一切都很好,但是这些示例非常无用,因为在REAL数据库应用程序中,网格是通过将多个表连接在一起而几乎从不在单个表中填充的。这样可以避免客户端数据集的“自动解决”功能。即使是提议的beforeupdateevent处理程序也不能在datasnap应用程序中工作,因为DB只能由datasnap服务器访问。因此,在我看来,我必须在datasnap服务器上创建一个方法,用于我将需要的EACH插入/更新,然后将这些方法公开给客户端并根据需要从客户端调用它们以请求datasnap服务器执行所需的操作更新/插入。这似乎很多工作!
是否有更简单的方法将https通信实施到SQL Server?
哦,如果您想知道,该应用程序已经是伪3层,因为网格连接到TdxMemData,而且从不直接连接到TADOQueries。我自己处理所有插入/更新的方式与我使用TClientdatasets时所需的方式相同。
答案 0 :(得分:6)
如果您认为您的数据库易受攻击,请考虑使用D2010 Datasnap。它非常非常脆弱。不要被HTTPS欺骗,仍然有很多部分缺少完全保护频道。例如,一旦使用Datasnap,SQL服务器Windows集成身份验证(基于kerberos的...)就不见了。
有关完整说明,请参阅:Why Datasnap 2010 is a toy library。这当然是我的个人意见,但是基于我自Delphi 3以来使用Midas / Datasnap的经验以及我目前关于IT安全的工作。
无论如何,你对插入/更新/删除都是错误的。您必须使用提供程序的事件来控制它们在datasnao服务器端。它比在双层应用程序中处理它们要复杂一些,但是每个操作都不需要特殊方法。
答案 1 :(得分:4)
[2016年更新:2016年DataSnap在安全性和功能方面落后于编写此问题时更为可悲。我根本不建议在任何新设计中使用它。]
DataSnap是解决构建多层(三个或更多)应用程序问题的解决方案。通过Internet从包含客户端中所有业务逻辑的胖客户端直接连接到SQL有许多众所周知的问题,包括业务逻辑更改然后要求您立即更新所有客户端的事实。数据快照(或其他)中间层逻辑中的中间层改进(业务逻辑更改)不会分发到每个客户端。客户端更薄,并且包含更少的业务逻辑。其次,您自己构建的精心设计的数据快照“API”只会让您面临自己创建的风险,而不是让您暴露于整个MS SQL漏洞集。
坦率地说,从胖客户端失去Kerberos身份验证,并不是放弃中间层思想的理由。我完全不明白ldsandon的观点。他是否提倡连接到Internet或LAN客户端的双层应用程序架构,并且包含所有业务逻辑,比多层应用程序“更安全”?
您的标题所暗示的隐含问题是无法回答的,并且未定义。 “真实”是什么意思?许多行业在自己的公司LAN中部署了两层胖客户端。许多人发现在自己的局域网中使用中间层是有益的,许多人发现在互联网上运行的外部应用程序绝对不应该将SQL连接呈现给胖客户端,因此他们提供某种“网络方法” (SOAP,REST + JSON等)架构。已经仔细指出Data-Snap不是一个纯粹的“RESTful”架构,但它确实使用了JSON,并且在很多方面都设计得很好,尽管还不完全。
如果您不理解创建DataSnap要解决的问题,很容易认为DataSnap毫无价值,或者(或者同样错误)某种银弹。它存在于特定目的,许多人认为这对他们的发展需求有用。如果你打算开展中间层的工作,那么DataSnap比100%更容易实现“滚动你自己的中间层”,但它比没有中间层更有效。