从Java客户端保护数据库

问题描述:

我使用的中心MySql数据库具有许多运行和使用此数据库的Java客户端(直接连接)。客户将公开可用,因此安全性成为问题。从Java客户端保护数据库

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

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

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

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

这可能实现吗? 它会是'安全'吗?

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

+0

你有没有听说过SQL注入?那么你刚刚提出的将会引入更糟糕的漏洞。 – rook 2010-02-05 15:45:45

+0

如果您阅读我的文章,我提到了我对SQL注入的担忧,并询问是否有方法在处理SQL之前清除(可能)用户输入的数据。 – Dave 2010-02-08 10:54:44

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

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

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

+0

当我提出我的问题时,我意识到三层方法,但是,由于多种原因,我真的想避免这种情况。 管理许多账户(每个用户1个账户)实现起来会非常困难,尤其是当我希望新用户无需管理员帮助即可注册和登录。即只下载客户端,并访问数据库(作为最低级别)。用户等级稍后将由管理员进行调整,通过调整数据库的用户表中的字段,允许他们逐步提高功能(从而更多地访问存储过程)。 – Dave 2010-02-05 10:01:53

+0

每次调用时的'检查权限级别'对于数据库来说都是额外的开销,但我相信在这种情况下会起作用,但它仍然容易受到SQL注入的攻击,除非我能找到一种方法来“清理”输入服务器端这意味着在SP内部。这就是困扰着我,虽然我会承认我可能正在寻找一些我还没有考虑过的其他安全问题。 – Dave 2010-02-05 10:03:12