我用PHP在PHP中写了很长时间的Web应用程序。我总是将我的数据库连接信息存储到配置变量中并以这种方式连接到数据库。
客户希望其网站的Java小程序与其数据库进行通信。我对此非常犹豫,因为applet将公开,我不确定如何存储数据库连接信息。
我很偏执,有人会反编译我的应用程序或找到一些方法来提取我的数据库连接信息并恶意使用它。
有关如何安全地执行此操作的任何建议吗?
答案 0 :(得分:5)
只是为了澄清一下,你并不太担心连接被“无意中听到”,你担心有人可能会破解你的applet并拔出数据库连接细节,对吗?
好吧,我可能不会让它直接连接,而是让它与一个以JSON / XML返回数据的网络应用程序交谈。如果他们真的想要,人们仍然可以从你的小程序中获取它,但他们只限于网络应用程序。
如果这不会漂浮你的船,请确保applet使用的数据库用户仅限于执行它所需的操作。如果它只是提取数据,请不要给它插入权限。
如果您只是在进行写入,则另一种选择是拥有公共数据库和私有数据库。从您的applet写入进入公共数据库并在验证后同步。这样做的问题是你可能会丢失一些内置的检查和关系,除非你保留公共数据库中所有数据的副本 - 这可能不安全。
另一个选择可能是为每个用户提供他们自己的数据库用户。然后,如果有人未经授权获取applet,他们仍然需要一个帐户才能进入。
我认为建立一个中间网络应用程序可能是你最好的选择,但我不知道完整的情况,所以我不是最好的判断。
答案 1 :(得分:1)
我建议有一个与网站通信的小程序。它本身与数据库进行通信。
答案 2 :(得分:1)
这是一个trusted client问题,在标准JDBC连接凭据之上没有深入研究关于身份验证扩展的JDBC,我建议您通过自己的数据库层包装所有请求。
我实际上已经使用Ajax实现了一个JDBC包装器,其中客户端将JS中的直接SQL语句发布到Servlet,后者将这些语句转换为数据库请求,我实现了更新和查询,整个实现不到300行Java Servlet代码和60行JS代码。
该解决方案不包含任何身份验证,但可以轻松添加到HTTP层之上。无论如何,您有一个受信任的客户端问题,它无法解决被黑客户端可以在任何预定义或指定的用例之外访问整个数据库模式的问题,例如:
select * FROM records
而不是后端请求:
SELECT id, data, val, ... FROM records WHERE userid = ...
仅选择由经过身份验证的用户创建的记录。确保维护安全性的唯一方法是仅通过预定义的数据检索/修改方法访问DB。否则,安全和数据隔离必须由数据库本身强制执行,阅读“昂贵的大O数据库”:)
上面我的400行JS / Java示例仅用于内部使用的测试系统。