关于这个有几个问题和帖子,但我还没有找到一个好的答案.我有一个Meteor应用程序,我想存储一个巨大的配置文件CONSTANTS,它将在我的应用程序中用于服务器和客户端,如下所示:
// Constant values used throughout app
DEFAULT_PLAYERS_PER_GAME = 4;
DEFAULT_LENGTH_OF_GAME = 300000;
DEFAULT_PLAYER_ACCOUNT_TYPE = 'basic';
BASIC_MONTHLY_FEE = 0;
PREMIUM_MONTHLY_FEE = 2.99;
// etc.etc.
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望所有这些值都在一个文件中的一个位置,我还需要在客户端上引用它们.例如,在注册模板中向用户显示月费.该费用将来自我的配置文件中的一个位置.
每次我需要在我的应用程序中实际引用服务器事务的CONSTANT时,我知道我将从Meteor方法后面的服务器获取值,以防止用户更改客户端上的值.我没有在我的app结构中找到一个允许客户端访问这些CONSTANTS而无法更改它们的位置.
如果它们仅存储在客户端上,那么当服务器访问它们时,用户只需使用JavaScript控制台即可更改它们.如果它们仅存储在服务器上,则我无法从客户端访问它们以向用户显示值.我假设如果它们存储在客户端/服务器文件夹中,它们仍然可以被客户端上的用户更改.
我有几个想法,但我发现它们都不理想:
仅将它们存储在服务器上,并使用Meteor方法将其值返回给客户端.这很麻烦,因为我发现从客户端获取Meteor方法的值的唯一方法是在Meteor方法回调中设置会话变量,这并不总是及时工作,因为回调是异步的.
使用环境变量.这对于安全值很有用,但客户端无法看到这些值.
在服务器和客户端上有两个单独的配置文件,只是确保所有服务器事务都使用服务器配置文件,因此值不能更改?我不喜欢这个,因为那时你必须更新两个不同文件中的值.
Meteor的优点在于,您可以将所有常量存储在唯一的源文件中,并在客户端和服务器上同时使用它们.
这就是我将这些常量置于其中的原因lib/constants.js,因为您可能知道共享的lib目录导出的变量可供客户端和服务器使用.
您似乎没有意识到的缺点是,即使变量出现在一个唯一文件中定义并在"共享"环境中可用,它们实际上也是在两个环境中单独定义的:服务器的Node.js全局上下文和浏览器窗口客户的对象.
这就是为什么即使恶意用户SOME_CRITICALLY_IMPORTANT_CONSTANT = "hacky value;"在浏览器控制台中写入,他实际上也是在引用,window.SOME_CRITICALLY_IMPORTANT_CONSTANT并且无法修改具有相同名称但位于单独的私有安全环境中的服务器变量.
这就是为什么如果一个用户在他的浏览器环境(window对象)中定义了他自己的常量副本,那么这可能无法对服务器造成伤害,只会破坏他的用户体验,但他应该这样做.
| 归档时间: |
|
| 查看次数: |
703 次 |
| 最近记录: |