本文介绍了在前端去中心化应用(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 上设置多Token身份验证。
轮换密钥的优缺点
Dot Env ( .env
) 是一种简单而有效的管理应用程序环境变量的方法。它通过使用 .env
文件来存储配置设置和敏感信息,例如 API 密钥和数据库密码。这种方法集中管理配置,使更新和维护更加便捷。Dot Env 有几个好处:
虽然 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);
});
这种方法有几个好处:
.env
文件中存储敏感数据,并使用后端代理来协调与外部服务的交互。.env
服务器文件中存储敏感变量,而不是客户端代码。.env
文件:确保 .env
文件不提交到公共存储库(使用 .gitignore
)。通过将 Dot Env 与后端代理结合使用,你可以在保持环境变量管理的简便和安全的同时,防范客户端暴露的风险。
Dot Env 和后端代理的优缺点
速率限制对于端点安全至关重要,尤其是在 Web 应用和 APIs 中。它涉及设置一个最大请求数量,你的端点在给定时间内可以处理。尽管这不能阻止其他人访问你的端点,但它将限制他们可以发出的请求数量。这可以帮助防止滥用和对资源的过度使用,从而导致性能问题和成本增加。
QuickNode 允许你直接从 QuickNode 控制台为任何端点设置速率限制。转到你的 QuickNode 控制台( https://dashboard.quicknode.com/)并选择要应用速率限制的端点。点击 安全性 标签,滚动到 "速率限制" 部分。在这里,你可以根据每秒、每分钟或每天的请求对你的端点应用限制。
选择要应用的速率限制类型,输入限制,然后点击 添加。你的速率限制将立即生效。
QuickNode 还提供特定于方法的速率限制。这可以在控制台的相同端点安全页面上找到。方法速率限制允许你为不同的 API 方法设置不同的限制,提供对端点使用的更精细控制。
速率限制的优缺点
域白名单(或引用者白名单)是一种简单但有效的限制访问你端点的方法。它涉及创建一个可以访问你端点的批准域的列表。这可以帮助防止未经授权的访问和滥用你的端点。QuickNode 允许你直接从 QuickNode 控制台为任何端点启用多个引用者白名单。
转到你的 QuickNode 控制台( https://dashboard.quicknode.com/)并选择要应用白名单的端点。点击 安全性 标签,向下滚动到 "引用者白名单" 部分。在这里,你可以将域添加到你的白名单中。输入你希望列入白名单的域并点击 添加。你的白名单将立即生效。你可以通过点击要删除的域旁边的 🗑️ 按钮轻松删除已列入白名单的域。
保存后,你可以通过使用 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) 是一种流行的 API 安全方法。它们是一个开放标准(RFC 7519),定义了一种精简和自包含的方式,在各方之间以 JSON 对象安全地传递信息。JWT 可以使用私密签名(通过 HMAC 算法)或使用 RSA 或 ECDSA 的公钥/私钥对进行签名。JWT 通常用于 Web 应用和 APIs 中的身份验证和信息交换。
JWT 通过验证信息的完整性来防止未授权访问。这是通过用一个私钥或公钥/私钥对签名一个有限期限的Token来实现的。没有Token或使用无效Token的请求(无论是因为Token已过期还是未使用正确的私钥签名)将被拒绝。
以下是如何在你的应用中实施 JWT 的简单示例(有关更详细的过程,请查看我们的 指南:如何在 QuickNode 中实现 JWT 授权):
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',
}
});
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 的对象
});
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();
JSON Web Tokens (JWT)
端点保护是一个强大的附加组件,为你的端点提供了额外的安全层。可以将端点保护视为可配置的高级速率限制器和防火墙,可以根据多种因素阻止请求,包括:
端点保护 是通过 QuickNode 市场 提供的附加组件。要将端点保护添加到你的端点,请转到你的 QuickNode 控制台( https://dashboard.quicknode.com/)并选择要将端点保护添加到的端点。点击 附加组件 标签,向下滚动到 "端点保护" 部分。点击 安装。你的端点保护将立即应用于你的帐户。
要使用你保护的端点,你需要做两件事:
demo-endpoint.quiknode.pro
-> demo-endpoint.secure.quiknode.pro
){
"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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!