2010-06-04 163 views
2

上下文: Java客户端应用程序需要访问服务器端MySQL数据库。限制MySQL请求

需要:限制每个客户端(基于客户端IP)对数据库的可能请求数量。

问题1:是否可以通过更改MySQL数据库设置来做到这一点?

问题2:允许直接从客户端应用程序访问数据库是一个好主意吗?还是应该让客户端应用程序通过TCP与服务器端应用程序进行通信? (因此只允许服务器端应用程序访问数据库)

回答

3

关于问题2

我认为这取决于数据,服务器和客户端和客户端的部署模式之间的网络连接的灵敏度。

  • 敏感数据:我肯定会用这个客户端 - 服务器 - 数据库解决方案。然后,您可以使用可能的客户端证书或读卡器实施https连接。
  • 网络连接:您不想将数据库暴露给互联网。永远。但是,如果它是一个内部应用程序,只能从受保护的公司网络访问,并且数据不敏感,则直接数据库连接是可行的。请正确处理行锁定或事务处理,否则您的用户将不会高兴:)
  • 转出架构:如果应用程序是主动开发的,那么数据库架构随之发生变化的可能性很大,这迫使客户端进行更新。通过一个中间服务器,例如SOAP/XML,您可以将数据库架构与数据请求分离,并且您有更多空间升级/更改数据库,而无需更新所有客户端。

我个人会选择中间服务器,因为它更容易维护和优化。 Python和Java都有很好的解决方案,可以让您快速创建具有数据库访问权限的SOAP/XML服务器。然后,您可以根据特定屏幕中所需的内容定义XML消息,并使用适当的锁定,并且不考虑数据库模式(ehm)。它将数据库模型从客户端的MVC模型中分离出来,并允许客户端相对干净。

2
  1. 您可以限制用户和主机对数据库的访问。
  2. 这取决于您传递的数据和您使用的网络(Internet或LAN)的敏感度。
+0

** 1)**我不想为每个客户端创建一个数据库用户。 (我只使用一个“客户端用户”。)但是我怎样才能限制主机(IP)的访问? ** 2)**我通过互联网传递重要的用户数据。 – asmo 2010-06-04 11:30:21

1

客户端 - >服务器 - >数据库当然是最安全的方法,因为客户端 - >数据库要求客户端应用程序包含数据库登录凭证。

使用客户端 - >服务器 - >数据库废除问题一:]。

+0

你证实了我的想法。 – asmo 2010-06-04 11:26:54

4
  1. 是的。查看MySQL's GRANT statement的语法。在with_option中,您可以指定MAX_QUERIES_PER_HOUR。您可以为现有用户,甚至设限,而不影响其他特权:ON db

    GRANT的使用* TO ...需要与MAX_QUERIES_PER_HOUR 120 MAX_UPDATES_PER_HOUR 100 SSL。

  2. 当然,只要客户端位于数据库的内部网络上,并且只有最小权限才能正常工作。为所有客户端维护MySQL授予可能有些困难,但至少您将使用经过验证的安全系统,而不是尝试将安全系统重新编写为可能存在错误的服务器端应用程序。

另请参阅5.5.4. Setting Account Resource Limits

+2

此外,您可以控制(通过mysql.user表):max_questions,max_updates,max_connections,max_user_connections – 2010-06-04 11:27:02

+2

对于大多数应用程序来说,拒绝或允许在表级别操作的安全系统几乎不够。每个允许更新其邮件地址的用户也将被允许更新同一个表中的所有其他值。读取相同。这对大多数应用程序来说是不可接受一个瘦web服务层(例如带有WSS4J的JAX-WS)更加灵活。 – sfussenegger 2010-06-04 11:48:10

+0

我修改了我的答案,明确指出客户端应该位于内部网络上,就像明确提到的@extraneon一样。数据库不得暴露于互联网,因为它存在太多的安全风险。 – 2010-06-04 12:05:36