从Java客户端保护数据库

时间:2010-02-05 09:06:04

标签: java mysql security stored-procedures sql-injection

我所使用的概念使用了一个中央MySql数据库,该数据库有许多运行和使用该数据库的Java客户端(直接连接)。客户端将公开可用,因此安全性成为一个问题。

由于Java可以反编译,我无法将此系统的安全部分放入客户端应用程序中。我需要有一个初始用户名/密码才能访问数据库,但除此之外,我无法真正保护客户端中的任何内容,因为黑客可能只是提取连接数据并编写自己的应用程序进行黑客攻击。

所以,这导致了我的paramaterised存储过程。这将允许我通过将权限限制为SELECT& amp;来保护数据库。执行。而且,我正在考虑让每个SP都有用户名/密码参数,因此每次调用SP都可以验证用户权限级别,以防止低级别用户破解/使用管理员SP。

这似乎提供了一定的安全性,并允许对数据库进行多级访问,但后来我进行了SQL注入。

如果我使用的是paramaterised SP,如何在SP将它们运行到数据库之前清理参数?在PhP中这很简单,但是使用本地运行的Java客户端,我没有服务器端应用程序来完成这项工作。我知道我可以在数据库和数据库之间放置某种服务器端应用程序。客户,但我想尽可能避免这种情况。

这有可能实现吗? 那么它会“安全”吗?

这是解决此问题的正确方法,还是使用此架构实现此类安全性的更好方法?

1 个答案:

答案 0 :(得分:5)

  

这是解决这个问题的正确方法,还是使用这种架构有更好的方法来实现这种安全性?

我认为你需要去三层。您不能将数据库直接公开给不受信任的客户端。您希望应用程序服务器介于两者之间。最终用户将登录到应用程序服务器(理想情况下,为每个用户输入一个单独的用户名/密码,该用户输入,并且不包含在应用程序中)。只有应用程序服务器连接到数据库,并且它只执行它认为合适的内容(如:不直接运行从客户端获取的任何类型的SQL,但定义了许多允许的方法/查询)。

如果您仍想直接从客户端转到数据库,至少要创建单个数据库用户帐户(并且没有硬编码密码)。但是这(适当地管理所有权限)可能最终会给DBA带来太大的麻烦,而配置错误可能会导致巨大的安全问题。