gpt4 book ai didi

java - Java 中的安全 MySQL 连接?

转载 作者:行者123 更新时间:2023-11-29 06:02:58 27 4
gpt4 key购买 nike

我试试这个:

Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sonoo","root","password");

但有人很容易破解用户名和密码字符串。

Opening Application with zip, winrar or any else program look like this and read code.

如何保护我的连接?

最佳答案

您需要决定获得您的 JAR 副本的人拥有哪些权限。他们是否有权运行数据库查询?

如果不应该:删除数据库连接。他们没有权限。

如果他们应该:那么他们可以获得密码。他们有权限。

似乎让您感到困惑的是您正在为您的数据库提供 root 密码,因此您需要第三个选项:“他们应该能够进行一些数据库查询,而不是其他人。”

JAR 文件是尝试解决该问题的错误位置。如果您尝试在 JAR 文件级别解决此问题,将会发生以下两种情况之一。要么你的用户一直都是值得信赖的,而你在使用任何精心设计的方案上浪费了时间,要么你的一些最终用户不值得信赖,其中之一会攻击你。他们会在 JVM 发送它们之前,在最后一秒,如果绝对必要的话,通过逐步执行 JVM 并编辑您的查询字符串来攻击您。 你在这个级别所做的一切都将是安全剧院,比如在机场被搜身,这不会让你明显更安全,但你有很小的机会可以说“但我们加密了 它!”在不可避免的安全漏洞之后,您的客户可能不会抛弃您。

这个问题需要在数据库中解决,方法是创建一个没有他们不应该拥有的权限的用户帐户。当您执行 SHOW GRANTS FOR enduser@'%' 时,它将仅向您显示他们被允许执行的查询种类。

在许多情况下,您希望为用户帐户提供比表上的 INSERT、SELECT 或 UPDATE 更细粒度的权限。例如,您可能有这样的逻辑“您可以添加到这个表,但前提是您还更新了另一个表中的数字”。对于这些,您应该使用存储过程,它们的权限可以设置为“定义者”或“调用者”:由具有适当权限的用户定义它,然后调用者获得执行此特定查询的高级权限。

在某些情况下,您会遇到一个糟糕的情况,您希望将同一个应用程序分发给两个不同的客户端,但它们都可以从能够读取彼此的数据中获益匪浅(以牺牲对方为代价!)。例如,您可能是与两家竞争公司打交道的订单处理员;任何一个都希望看到另一个的订单历史记录。对于这些情况,您有几种选择:

  1. 甚至将 SELECT 语句移动到存储过程中。存储过程可以调用 user(),它仍然可以为您提供登录用户,即使他们不是定义者。
  2. 将数据库查询移出共享 JAR。正如 @g-lulu 上面所说,您可以创建一个网络 API,您可以很好地锁定它,或者类似的东西。
  3. 复制数据库,将身份验证参数移动到您在启动时读取的单独文件中。

选项 3 要求您编写工具来维护多个数据库,使其成为彼此结构的完美副本,这很糟糕。然而,与 (1) 和 (2) 相比,共享数据库不可避免地会泄漏一些信息——例如,auto_increment ID 列可能会泄漏全局正在创建的订单数量,并且可能有确定类似“哦,他们通过这种不寻常的表访问发送所有订单,所以这也会同时碰撞这个 ID,所以我只需要检查两个 ID 是否都被碰撞,这将透露我们竞争对手公司的订单”。

关于java - Java 中的安全 MySQL 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43683827/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com