从Java客户端保护数据库

从Java客户端保护数据库,java,mysql,security,stored-procedures,sql-injection,Java,Mysql,Security,Stored Procedures,Sql Injection,我的概念是使用一个中央MySql数据库,它有许多Java客户机运行并使用这个数据库(直接连接)。客户机将公开提供,因此安全性成为一个问题 由于Java可以反编译,我无法将此系统的安全部分放入客户端应用程序。我需要一个初始用户名/密码才能访问数据库,但除此之外,我无法真正保护客户端中的任何内容,因为黑客可以提取连接数据并编写自己的黑客应用程序 所以,这让我想到了参数化存储过程。这将允许我通过将权限限制为仅选择和执行来稍微保护数据库。而且,我正在考虑让每个SP都有用户名/密码参数,这样每次调用SP都

我的概念是使用一个中央MySql数据库,它有许多Java客户机运行并使用这个数据库(直接连接)。客户机将公开提供,因此安全性成为一个问题

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

所以,这让我想到了参数化存储过程。这将允许我通过将权限限制为仅选择和执行来稍微保护数据库。而且,我正在考虑让每个SP都有用户名/密码参数,这样每次调用SP都可以验证用户权限级别,以防止低级别用户入侵/使用admin SP

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

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

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

这是正确的方法,还是有更好的方法使用这种体系结构实现这种安全性

这是正确的方法,还是有更好的方法使用这种体系结构实现这种安全性

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


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

正如我在问题中所说的,我知道三层方法,但是,出于一些原因,我真的希望避免这种情况。管理多个帐户(每个用户1个)太难了,尤其是我希望新用户能够在没有管理员帮助的情况下注册和登录。ie,只需下载客户端和access数据库(作为最低级别)。管理员随后会调整用户排名,通过调整数据库用户表中的一个字段,允许他们逐步实现更大的功能(从而更多地访问存储过程)。每次调用的“检查权限排名”对数据库来说是额外的开销,但我相信在这种情况下会起作用,但它仍然容易受到SQL注入的攻击,除非我能找到一种方法来“清理”输入服务器端,这意味着在SP内部。这正是困扰我的问题,尽管我承认我可能正在寻找一些我还没有考虑过的其他安全问题。你听说过SQL注入吗?你刚才建议的是引入一个更糟糕的漏洞。如果你读了我的帖子,我提到了我对SQL注入的担忧,并询问是否有办法在处理SQL之前清除(可能的)用户输入的数据。