如何保护你的终端 - 前端最佳实践

  • QuickNode
  • 发布于 2024-12-10 10:57
  • 阅读 24

本文介绍了在前端去中心化应用(dApp)中如何保护端点的多种策略,包括密钥轮换、Dot Env与后端代理、速率限制、域名白名单、JSON Web Tokens(JWT)以及端点防护。文章详细说明了每种方法的实施步骤、优缺点,并提供了相关工具的使用指南。

概述

如果你正在构建一个前端去中心化应用程序(dApp),你的网站需要通过端点节点连接到区块链。你可以将你的端点视为一个 API 密钥,它允许你连接到区块链。如果你正在使用前端(例如,一个 Candy Machine 生成页面或一个 Defi 应用),你可能会向公众暴露你的端点。这意味着恶意行为者可能会利用并使用你的私有端点。这可能会让你的账单增加并导致其他性能问题。在本指南中,你将学习在使用前端时保护你的端点的各种策略:

策略 简易/复杂 效果 QuickNode 计划
轮换密钥 🟡 中等 🟢 高 所有计划
后端代理的 Dot Env 🟢 简单 ⚪ 中等 不适用
速率限制 🟢 简单 ⚪ 中等 所有计划
域白名单 🟡 中等 ⚪ 中等 所有计划
JSON Web Tokens (JWT) 🔴 复杂 🟢 高 所有计划
端点保护 🟡 中等 🟢 高 市场附加组件

轮换密钥

轮换密钥是一种简单但有效的保护端点的方法。它涉及定期轮换端点的私有Token,以防止未经授权的访问。这意味着即使你的端点被暴露,它也只会在有限的时间内处于脆弱状态。QuickNode 允许你直接从 QuickNode 控制台轮换密钥。

只需打开你的 QuickNode 控制台( https://dashboard.quicknode.com/)并选择要轮换密钥的端点。点击 安全性 标签,滚动到 "身份验证:Token" 部分。在这里,你可以添加或删除新的密钥。新密钥将立即可用。只需复制新密钥并在你的应用中使用。你可以通过点击要删除的密钥旁边的 🗑️ 按钮来删除旧的密钥。任何已被泄露的先前密钥一旦删除将不再有效。

QuickNode 控制台 - 轮换密钥

定期轮换你的密钥可以显著降低未经授权访问你端点的风险。有关如何轮换密钥的更多信息,请查看我们的 指南:如何在 QuickNode 上设置多Token身份验证

轮换密钥的优缺点

  • 优点:简单,安全
  • 缺点:耗时(需要定期轮换密钥),密钥管理

Dot Env 和后端代理

Dot Env

Dot Env ( .env) 是一种简单而有效的管理应用程序环境变量的方法。它通过使用 .env 文件来存储配置设置和敏感信息,例如 API 密钥和数据库密码。这种方法集中管理配置,使更新和维护更加便捷。Dot Env 有几个好处:

  1. 安全性:将敏感数据保留在代码库之外,降低在版本控制系统中暴露它们的风险。
  2. 灵活性:允许在不同环境(例如开发、测试、生产)中使用不同的配置,而无需更改代码。
  3. 易于使用:简化管理特定于环境的变量。

后端代理

虽然 Dot Env 对管理环境变量很有效,但如果 .env 文件被提供给客户端,存储在其中的变量可能会无意中暴露。后端代理是解决此问题的极好方案。后端代理充当客户端和服务器之间的中介。它可以处理需要敏感数据的请求,例如你的端点,而不会向客户端暴露这些数据。以下是一个后端代理进行 Solana getBalance 请求的示例:

backendProxy.js

const dotenv = require('dotenv');
dotenv.config();
const PRIVATE_ENDPOINT = process.env.PRIVATE_ENDPOINT;
const solanaWeb3 = require('@solana/web3.js');
const app = express();

app.get('/getBalance', async (req, res) => {
  const connection = new solanaWeb3.Connection(
    PRIVATE_ENDPOINT,
    'confirmed',
  );
  const balance = await connection.getBalance(req.query.publicKey);
  res.send(balance);
});

这种方法有几个好处:

  1. 安全数据处理:后端代理可以安全地处理请求并管理敏感数据,例如 API 密钥,而不向客户端暴露它们。
  2. 环境变量:在服务器上的 .env 文件中存储敏感数据,并使用后端代理来协调与外部服务的交互。
  3. 减少暴露风险:这种方法显著降低敏感信息暴露的风险,因为数据永远不会到达前端。

最佳实践

  • 在服务端使用 Dot Env:在 .env 服务器文件中存储敏感变量,而不是客户端代码。
  • 不要提交 .env 文件:确保 .env 文件不提交到公共存储库(使用 .gitignore)。
  • 实施后端代理:使用后端代理处理需要敏感数据的请求,确保这些数据不在客户端应用中暴露。

通过将 Dot Env 与后端代理结合使用,你可以在保持环境变量管理的简便和安全的同时,防范客户端暴露的风险。

Dot Env 和后端代理的优缺点

  • 优点:适应性强,可扩展,安全
  • 缺点:代码库复杂性(额外的服务端代码)和性能开销

速率限制

速率限制对于端点安全至关重要,尤其是在 Web 应用和 APIs 中。它涉及设置一个最大请求数量,你的端点在给定时间内可以处理。尽管这不能阻止其他人访问你的端点,但它将限制他们可以发出的请求数量。这可以帮助防止滥用和对资源的过度使用,从而导致性能问题和成本增加。

设置速率限制

QuickNode 允许你直接从 QuickNode 控制台为任何端点设置速率限制。转到你的 QuickNode 控制台( https://dashboard.quicknode.com/)并选择要应用速率限制的端点。点击 安全性 标签,滚动到 "速率限制" 部分。在这里,你可以根据每秒、每分钟或每天的请求对你的端点应用限制。

QuickNode 控制台 - 速率限制

选择要应用的速率限制类型,输入限制,然后点击 添加。你的速率限制将立即生效。

方法速率限制

QuickNode 还提供特定于方法的速率限制。这可以在控制台的相同端点安全页面上找到。方法速率限制允许你为不同的 API 方法设置不同的限制,提供对端点使用的更精细控制。

QuickNode 控制台 - 方法速率限制

速率限制的优缺点

  • 优点:易于实施/修改
  • 缺点:如果限制过低,可能会影响用户体验,无法阻止访问端点

域白名单

域白名单(或引用者白名单)是一种简单但有效的限制访问你端点的方法。它涉及创建一个可以访问你端点的批准域的列表。这可以帮助防止未经授权的访问和滥用你的端点。QuickNode 允许你直接从 QuickNode 控制台为任何端点启用多个引用者白名单。

白名单域

转到你的 QuickNode 控制台( https://dashboard.quicknode.com/)并选择要应用白名单的端点。点击 安全性 标签,向下滚动到 "引用者白名单" 部分。在这里,你可以将域添加到你的白名单中。输入你希望列入白名单的域并点击 添加。你的白名单将立即生效。你可以通过点击要删除的域旁边的 🗑️ 按钮轻松删除已列入白名单的域。

QuickNode 控制台 - 域白名单

保存后,你可以通过使用 cURL 脚本或从未列入白名单的域请求你的端点来测试你的白名单。你应该会收到 UNAUTHORIZED 响应。

例如,这个请求:

curl https://your-endpoint.solana-mainnet.quiknode.pro/123/ \
  -X POST \
  -H "Content-Type: application/json" \
  --data '{"jsonrpc":"2.0","id":1, "method":"getBlock"}'

现在应该返回:

{
    "error":"UNAUTHORIZED",
    "instance":"your-endpoint",
    "request-id":""
}

域白名单的优缺点

  • 优点:易于实施/修改
  • 缺点:有效性有限

有关如何列入白名单的更多信息,请查看我们的 指南:如何在 QuickNode 中设置引用者白名单

JSON Web Tokens (JWT)

JSON Web Tokens (JWT) 是一种流行的 API 安全方法。它们是一个开放标准(RFC 7519),定义了一种精简和自包含的方式,在各方之间以 JSON 对象安全地传递信息。JWT 可以使用私密签名(通过 HMAC 算法)或使用 RSA 或 ECDSA 的公钥/私钥对进行签名。JWT 通常用于 Web 应用和 APIs 中的身份验证和信息交换。

JWT 通过验证信息的完整性来防止未授权访问。这是通过用一个私钥或公钥/私钥对签名一个有限期限的Token来实现的。没有Token或使用无效Token的请求(无论是因为Token已过期还是未使用正确的私钥签名)将被拒绝。

实施 JWT

以下是如何在你的应用中实施 JWT 的简单示例(有关更详细的过程,请查看我们的 指南:如何在 QuickNode 中实现 JWT 授权):

  1. 密钥生成:使用 RSA 或 ECDSA 生成公钥/私钥对。示例:
const { generateKeyPairSync } = require('crypto');
var jwt = require('jsonwebtoken');

// 生成 RSA 密钥
const { publicKey, privateKey } = generateKeyPairSync('rsa', {
    modulusLength: 2048,
    publicKeyEncoding: {
        type: 'spki',
        format: 'pem'
    },
    privateKeyEncoding: {
        type: 'pkcs8',
        format: 'pem',
    }
});
  1. 定义密钥:将你的公钥添加到你的 QuickNode 控制台(安全性标签)。
  2. Token生成:在你的后端,使用你的私钥生成一个有限的 JWT(例如,处理交易请求的 60 秒)。示例:
const app = express();
const jwt = require("jsonwebtoken");

app.get('/get_token', (req, res) => { // 获取 JWT 的端点
  const privateKey = process.env;
  var token = jwt.sign({}, privateKey, {
    algorithm: 'RS256', // 使用 SHA-256 的 RSA 签名
    expiresIn: "60000"  // 60 秒
  });
  return res.json({ token: token }); // 返回一个包含签名 JWT 的对象
});
  1. 建立连接:在前端,使用 JWT 连接到你的端点。示例:
const { Connection } = require('@solana/web3.js');
async function makeRequest() {
    const token = await fetch('/get_token'); // 从后端获取 JWT
    const connection = new Connection('https://example.solana-devnet.quiknode.pro/12345/', {
        httpHeaders: {
            'Accept': 'application/json',
            'Content-Type': 'application/json',
            'Authorization': `Bearer ${token.token}`
        }
    });
    const block = await connection.getBlock();
    // 处理区块
}
makeRequest();
  1. Token验证:当我们收到请求时,我们可以使用你添加到你的 QuickNode 控制台的公钥验证Token。这将确保Token有效且未被篡改。

最佳实践

  • 密钥管理:安全地管理和定期轮换加密密钥。
  • Token过期:设置适当的Token过期时间以降低Token滥用的风险。

JSON Web Tokens (JWT)

  • 优点:安全,可扩展,适应性强
  • 缺点:代码库复杂性(额外的服务端代码和密钥管理)

端点保护

端点保护是一个强大的附加组件,为你的端点提供了额外的安全层。可以将端点保护视为可配置的高级速率限制器和防火墙,可以根据多种因素阻止请求,包括:

  • 全局限制,
  • 访客限制,
  • 特定方法的限制,
  • 方法限制,
  • 参数限制,
  • 合同限制。

使用端点保护

端点保护 是通过 QuickNode 市场 提供的附加组件。要将端点保护添加到你的端点,请转到你的 QuickNode 控制台( https://dashboard.quicknode.com/)并选择要将端点保护添加到的端点。点击 附加组件 标签,向下滚动到 "端点保护" 部分。点击 安装。你的端点保护将立即应用于你的帐户。

要使用你保护的端点,你需要做两件事:

  1. 更新你的端点 URL(端点保护使用一个独特的子域: demo-endpoint.quiknode.pro -> demo-endpoint.secure.quiknode.pro
  2. 定义你的保护规则。以下是一个实施示例:
{
  "methods": {
    "getSlot": {
      "reqPerHour": 1000,
      "reqPerMinute": 100,
      "reqPerSecond": 10,
      "minBlockNumber": 24000000
    }
  },
    "visitorRateLimits": {
        "reqPerMinute": 10
    }
}

上面的示例白名单一个方法: getSlot。它将允许每小时 1,000 个请求,每分钟 100 个,请求限制为每秒 10 个(全局)。它还将仅允许大于 24,000,000 的槽请求。最后,它将允许来自单个访问者的每分钟 10 个请求。

有关如何部署端点保护的更多详细信息,请查看我们的 指南:如何使用端点保护保护你的端点

端点保护的优缺点

  • 优点:安全,可扩展,可配置
  • 缺点:额外成本,端点可见(因此在保护的限制内可以被攻击)

结束语

在前端实践良好的端点安全对于保护你的端点免受未授权访问和滥用至关重要。实施本指南中概述的策略可以显著降低未经授权访问你端点的风险。

如果你卡住或有问题,请在我们的 Discord 中提问。通过关注我们的 Twitter (@QuickNode) 或我们的 Telegram 公告频道 来保持最新。

我们 ❤️ 反馈!

告诉我们 如果你有任何反馈或对新主题的请求。我们乐意倾听你的声音。

资源

  • 原文链接: quicknode.com/guides/qui...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
QuickNode
QuickNode
江湖只有他的大名,没有他的介绍。