【问题标题】:Call Node 'require' function from within browser JavaScript从浏览器 JavaScript 中调用 Node 'require' 函数
【发布时间】:2021-03-03 20:52:13
【问题描述】:

在 Squarespace websiteone page 上,我需要从页面 JavaScript 中调用 Node js 'require' 函数。我正在本地使用最小测试用例。节点已安装。

相关代码为:

require('dotenv').config();
AWS.config.update({
  'region': process.env.AWS_REGION,
  'accessKeyId' : process.env.ACCESS_KEY_ID,
  'secretAccessKey' : process.env.SECRET_ACCESS_KEY,
  'endpoint' : process.env.ENDPOINT
});

“秘密”ID 和密钥值将存储在隐藏的环境变量 .env 中,而不是在页面上。

仅使用此代码,我得到一个 require-undefined 错误。我需要必要的代码才能在 JavaScript 中识别 Node 函数。

我在这里看到了另一种方式的问题,即在 Node 中识别 JavaScript 函数,但没有这种方式。在这些答案中,我没有看到任何我可以使用的东西。我也在网上搜索过,但大部分回复都是这里的问题。

【问题讨论】:

  • 在浏览器中没有require的问题之后,你也会遇到process.env也无权访问的问题。该代码在您用户的浏览器中运行,您无法对其保密。
  • 您需要将此代码移至后端。从前端到后端进行 Ajax 调用,让后端执行您需要的任何对 AWS 的安全访问。永远不能给客户秘密。没有办法在前端保护它们。你从哪里得到这个代码应该在前端执行的想法。我很确定 SquareSpace 的开发人员文档从未告诉过您这样做。所以,无论你从哪里得到这个想法,你一定误解了你应该做什么。
  • 而且,没有在浏览器中运行的 nodejs require() 版本。这是一个仅在您的服务器上运行的 nodejs 函数。此外,您永远不会在浏览器中运行 nodejs 函数。您在 nodejs 服务器中运行它们。如果客户端代码需要仅在服务器上运行的东西,您可以在请求页面时将该信息嵌入到原始网页中(动态内容),或者您从网页向服务器发出 ajax 调用以请求服务器做一些操作或检索一些结果。
  • 您不能在浏览器中使用 nodejs 功能。 nodejs 环境不在浏览器中运行。当然,有 Javascript 代码在浏览器中运行,但您不能在浏览器中使用 nodejs 功能。在您的代码中,您使用 AWS 和 SquareSpace 之间有什么联系?您尝试在 AWS 上做的事情是针对 nodejs 服务器的,而不是针对浏览器的。
  • 客户端中没有什么是安全的。因此,如果您直接从客户端更改数据库,那么世界上任何黑客都可以完全访问您的 DynamoDB(这真的很糟糕)。您确实需要您自己的 nodejs 服务器来控制对 DynamicDB 的访问(包括您的所有凭据),并将 Ajax 调用从浏览器发送到您的 nodejs 服务器,然后该服务器安全地与您的 DynamicDB 数据库对话。然后,您的 nodejs 服务器可以验证传入请求以查看它们是否合理,并且您将所有 AWS 凭证仅保留在您的 nodejs 服务器上。

标签: javascript node.js require


【解决方案1】:

我将从我的 cmets 中总结几个相关点:

  1. 首先,了解在浏览器中运行代码和在您自己的 nodejs 服务器中运行代码之间的区别以及各自适合的活动类型非常重要。

  2. 您不能在浏览器中运行 nodejs 代码。虽然浏览器和 nodejs 都可以运行 vanilla Javascript 代码,但整个 nodejs 运行时库仅在 nodejs 环境中可用,在浏览器中不可用。类似地,浏览器环境中有许多可用的东西,例如 DOM。因此,require()dotenv 模块之类的东西完全设计为在 nodejs 环境(通常是服务器)中运行,而不是在浏览器中。有一些第三方模块可以在任一环境中运行(例如用于从其他服务器发出 http 请求的 Axios)。

  3. 您在浏览器中嵌入客户端 Javascript 的任何内容都不是安全的。任何黑客或开发人员都可以使用它。因此,您永远不会希望将 AWS 凭证放入网页中。

  4. 当使用凭证(例如您的 AWS 凭证)或访问数据库(例如您的 DynamoDB)时,您不会希望直接从浏览器访问这些。为此,您需要将您的凭据直接嵌入到网页中,这将使任何黑客都可以完全访问您的数据库,在那里他们可以造成各种破坏。

  5. 相反,您需要设置自己的服务器来管理您的 AWS 凭证并控制数据库中哪些内容可以修改,哪些内容不能修改。这样做,您可以确保您的服务器上的凭据安全(永远不要将它们放在客户端中),并且您的 nodejs 服务器能够决定对数据库进行哪些更改是合适的,哪些不合适。

  6. 然后,如果您想从客户端对数据库进行一些更改(添加、修改、删除),您可以从浏览器网页向您的 nodejs 服务器发送一个 Ajax 调用,指定您想要更改的内容。您的 nodejs 服务器验证请求(确保这样做是合理的,检查发出请求的用户是否有权这样做),然后您的 nodejs 服务器可以使用您的 AWS 凭证登录到数据库并进行适当的更改数据库。

  7. 如果客户端想要返回结果,那么您的服务器可以发回适当的结果。

【讨论】:

  • 我只想补充一点,现在很明显我需要将站点迁移到其他地方。这是最根本的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 2013-10-14
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多