首页 > 解决方案 > GWT - 确保 SQL 密码永远不会交给客户端

问题描述

我有一个 GWT 项目,服务器需要与 SQL 数据库通信。它需要密码才能做到这一点。该密码需要存储在某个地方。我可以想到三个位置来存储该密码:

  1. 就在呼叫中DriverManager.getConnection
  2. final String某处的田野。
  3. .properties 文件。

对于案例 1 和 2,我们想到了将源代码转换为 JavaScript 并发送到客户端的场景。
这永远不会故意发生,因为服务器与数据库而不是客户端对话才有意义,但它可能会意外发生。在情况 1 中,GWT 可能会抱怨它无法处理 JDBC,但在情况 2 中,该字段可能在某个Constants编译得很好的类中。
我没有足够的 GWT 经验来了解如何处理 .properties 文件。例如,目录中的src\foo\server文件可能不包含在传递给客户端的 JavaScript 中,但后来有人可能会不小心将文件移动到包含它的其他位置。

那么如何确保密码永远不会意外发送给客户端呢?

请注意,我不在乎密码是否以纯文本形式存储在代码或配置文件中。

编辑:

澄清我目前的情况:
TestModule.gwt.xml 包含<source path='client'/>. 它包含<source path='shared'/><source path='server'/>! 我有共享配置和仅限服务器的配置(仅限服务器的配置将包含数据库的密码) :从客户端代码类没有任何问题:
在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

这是一个问题,因为我(或其他人)可能会不小心导致带有密码的类被转换为 JS 并发送给客户端。

标签: securitygwt

解决方案


数据库密码应该存储在属性文件中而不是代码中的某个位置。与代码不同,此属性文件不应提交给版本控制系统(如 git 或类似系统)。它也应该在网络文件夹之外。

此外,使用 public final static String 存储密码会带来巨大的安全风险。公共成员对所有其他类都是可见的,静态意味着不需要使用它的实例,而最终它不会改变。在您的代码中,您正在存储一个字符串常量,该常量可用于该类的所有实例以及使用该类的其他对象。这不是开始考虑安全风险的好方法,并且与 GWT 没有直接关系。这就像在没有墙壁或门的银行中存放大量金钱,然后询问如何才能使其安全。

只要数据保留在服务器端,就可以了。默认情况下,仅为可翻译代码指定客户端和共享路径。如果您的服务器类未实现 IsSerializable 并且未在 gwt.xml 文件中为可翻译代码明确指定,它们将不会被发送到客户端。


推荐阅读