我需要从 java 桌面应用程序连接到 MySQL 数据库。我计划这样做的方式是使用 HTTP 在我的网站上打开一个 php 页面,该 PHP 脚本将处理所有 mysql 内容,因此客户端根本无法访问我的 MySQL 用户/密码。所以,我的问题是,是否需要 SSL?还有,我怎样才能防止人们将 URL 带到 PHP 脚本并使用他们的 Web 浏览器来搞砸数据库?
3 回答
这可能应该在安全站点上,但无论如何。
如果您不希望发送到数据库的所有内容都对全世界可见,请使用 SSL。
如果您不希望世界上任何人进行更改,请强制客户端在对数据库进行任何更改之前对您的服务器端脚本进行身份验证。
确保防止 SQL 注入。
所以,我的问题是,是否需要 SSL?
SSL 通过加密帮助提供一层安全保护,防止人们劫持连接和拦截您发送的内容(有关更多信息,请参阅:Firesheep)。因此,虽然不是必需的,但它本身是推荐的。如果您可以控制 Java 应用程序,并且根据您的目的(即内部应用程序),那么您可以使用自签名证书并将证书与应用程序打包以进行验证(请参阅:this SO question for有关自签名与 CA SSL 证书的更多信息)。
我怎样才能防止人们将 URL 带到 PHP 脚本并使用他们的 Web 浏览器来搞乱数据库?
与其他信息安全事务一样,没有什么是 100% 保证的,但最常见的方法是通过 API 密钥,特别是因为您所描述的是 API。
如果您正在寻找一种快速而简单的设置,那么您可以使用 HTTP 基本身份验证来发送一些凭据,并使用 SSL 来保护它。对于更强大的解决方案,您可能需要研究 HTTP Digest Authentication 和/或 OAuth。您使用什么也取决于您的具体需求。
然后,您可以将 API 密钥编码到 Java 应用程序中,或者创建一种生成和请求 API 密钥的方式(同样,取决于您的特定目的和需求),客户端将 API 密钥与请求一起发送。如果密钥与您“存档”的密钥不匹配,则您拒绝该请求。
关于使用 API 与直接连接到 MySQL 的快速说明
有几个人提出直接连接到 MySQL。我认为这是一个有效的选择,但很大程度上取决于您在做什么以及您要分发给谁(以及,就此而言,您是否要向其他客户开放该数据库)。
如果您计划让其他客户端(例如移动设备)连接到此数据库,或者您出于任何原因无法控制数据库(即 - 您的托管设置不允许您提供远程访问) ,那么从长远来看,构建 API 可能会很有用。
但是,如果您没有这样的计划,或者您确实拥有数据库的完全控制权,并且您控制了 Java 应用程序的源代码,那么直接连接到 MySQL 数据库是一个有效的选择。只要确保您遵循最少访问原则——Java 应用程序获得一个专用的 MySQL 用户,该用户只拥有绝对必要的权限——并且 Java 应用程序用户有一个强密码(因为在你之后没有人参与这个过程编码它,您可以使用密码生成器来创建长而复杂且完全随机的东西)。
为什么不直接使用带有 SSL 的 MySQL 用户身份验证?编写自己的网桥听起来只会导致问题并暴露出比其他方式更多的安全漏洞。