security - GWT - 确保 SQL 密码永远不会交给客户端
问题描述
我有一个 GWT 项目,服务器需要与 SQL 数据库通信。它需要密码才能做到这一点。该密码需要存储在某个地方。我可以想到三个位置来存储该密码:
- 就在呼叫中
DriverManager.getConnection
。 final String
某处的田野。- .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 并发送给客户端。
解决方案
数据库密码应该存储在属性文件中而不是代码中的某个位置。与代码不同,此属性文件不应提交给版本控制系统(如 git 或类似系统)。它也应该在网络文件夹之外。
此外,使用 public final static String 存储密码会带来巨大的安全风险。公共成员对所有其他类都是可见的,静态意味着不需要使用它的实例,而最终它不会改变。在您的代码中,您正在存储一个字符串常量,该常量可用于该类的所有实例以及使用该类的其他对象。这不是开始考虑安全风险的好方法,并且与 GWT 没有直接关系。这就像在没有墙壁或门的银行中存放大量金钱,然后询问如何才能使其安全。
只要数据保留在服务器端,就可以了。默认情况下,仅为可翻译代码指定客户端和共享路径。如果您的服务器类未实现 IsSerializable 并且未在 gwt.xml 文件中为可翻译代码明确指定,它们将不会被发送到客户端。
推荐阅读
- python - 在 Python 中自定义聚合列时分组、过滤顶部行
- android - IAP 购买与 Apple 订阅有关
- javascript - 如何检查@everyone 是否可以在特定的 Discord 频道中发送消息?
- git - git.exc.InvalidGitRepositoryError
- java - 如何在 Java 中获取快捷方式/链接的图标?
- python - CrawlSpider 回调不起作用,下一页被检索一次
- android - 在使用 firebase 数据库和 searchview 时遇到致命异常
- node.js - Firebase 函数的异步初始化
- prisma - 使自动增量跳过一些 id
- cordova - 关于ANDROIDX的CORDOVA BUILDING APP警告