如何使用端点装甲保护你的终端安全

  • QuickNode
  • 发布于 2025-01-01 17:32
  • 阅读 23

文章介绍了如何在区块链应用中通过QuickNode的Endpoint Armor增强终端安全性,包括方法限制、全局速率限制和访客速率限制的配置,并通过React应用示例展示了如何与安全的区块链终端进行交互。

概述

在数字时代,终端安全至关重要。由于区块链终端作为与区块链交互的接口,因此保护这些终端对于防止未经授权的访问至关重要。鉴于区块链交易的不可变特性,确保只有授权请求能够到达你的终端,对于维护区块链操作的完整性和可靠性至关重要。

尽管一般安全措施很重要,但它们可能无法完全满足区块链终端安全的具体需求。这时,Endpoint Armor 附加组件就显得尤为重要。Endpoint Armor 通过支持特定方法的访问控制和可自定义的速率限制来增强安全性。这些功能确保只有授权的交互发生,以及终端能够处理流量而不会被压垮,从而显著增强你的系统安全性和稳定性。此附加组件尤其适合在应用程序的前端安全地暴露 URL。

在本指南中,你将学习如何使用 Endpoint Armor 提高 QuickNode 终端的安全性。

你将要做的事情

  • 激活 Endpoint Armor:你将首先在所选的 QuickNode 终端上启用 Endpoint Armor。

  • 配置方法限制:你将识别并限制对终端安全至关重要的特定区块链方法。这包括阻止不必要的方法或限制对它们的访问。

  • 应用方法特定的速率限制:为了更精细的控制,你将对各个区块链方法设置速率限制,以确保关键功能不会因过多请求而受到影响。

  • 设置全局速率限制:你将为终端建立全局速率限制,以控制总体流量并防止过载或滥用。

  • 实现访客特定的速率限制:你将基于不同类型访客(例如常规用户、开发者或智能合约操作员)的特定需求和使用模式,自定义对其的速率限制。

你将需要的东西

Endpoint Armor 概述

Endpoint Armor 是 QuickNode 开发的安全附加组件,能够在你的 QuickNode 终端上启用特定方法的限制,并建立针对各个方法的速率限制。此外,它还提供对整个终端设置全局速率限制和针对每个独特访客的速率限制的功能。

Endpoint Armor 创建一个特定的 URL,具有你为终端设置的限制。这些限制不适用于你的终端的默认 URL。

默认终端 安全终端
URL demo-endpoint.quiknode.pro demo-endpoint.secure.quiknode.pro
限制 无速率限制 基于配置的速率限制

Endpoint Armor 的主要功能包括:

  • 方法限制:此功能仅允许在此设置中明确列出的带有方法特定速率限制或全局速率限制的方法。
  • 终端速率限制:这些是适用于整个终端的全局速率限制。
  • 访客速率限制:这些限制适用于每个独特访客。

方法限制

info

在设置速率限制时,必须在配置中指定 至少一个方法名称。这是因为 Endpoint Armor 默认会 阻止 未明确提及的方法。因此,为确保你的终端允许访问所需的方法,你必须列出每个打算使用的方法。

在方法限制中,你可以启用某个方法,不带特定速率限制有唯一速率限制,与全局设置独立。

除了标准的速率限制设置外,某些方法还提供额外的选项以进一步自定义:

  • eth_call(仅限 EVM 链)
    • contractAllowlist:可以调用的合约地址数组。只有在此数组中指定的合约才能在设置此选项时用 eth_call 调用。
  • eth_getLogseth_getBlockByNumber(仅限 EVM 链) | getBlock(Solana)
    • latestBlocks:可以从最新区块查询的区块限制。最新区块由 eth_blockNumber 确定。例如,如果最新区块编号为 1000,而 latestBlocks 设置为 100,则可以查询 900-1000(包含)范围内的任何区块。
    • minBlockNumber:可以查询的最低区块编号。例如,如果 minBlockNumber 设置为 1000,则无法查询 1000 之下的任何区块编号。
    • maxBlockNumber:可以查询的最高区块编号。例如,如果 maxBlockNumber 设置为 1000,则无法查询 1000 以上的任何区块编号。

终端速率限制

endpointRateLimits 键定义整个终端的全局速率限制。它为控制终端流量提供了整体控制方法。

访客速率限制

visitorRateLimits 键定义每个访客到网站的速率限制。这种限制特别重要,适用于包含浏览器头的请求,表明请求来自个人用户,而不是由服务器端操作生成。

理解标准速率限制选项

在 Endpoint Armor 中配置速率限制时,有三个主要选项可用:reqPerHourreqPerMinutereqPerSecond。这些选项在设置在不同层次(整个终端、个别访客和特定方法)之间的限制时有效。它们的功能如下:

  • reqPerHour:设置在一小时内允许的最大请求数量。
  • reqPerMinute:定义每分钟允许的请求数量限制。
  • reqPerSecond:限制每秒可以发出的请求数量。

理想的终端安全设置

启用 Endpoint Armor 时,请确保启用了 基于Token的身份验证 作为主要安全措施。请注意,禁用基于Token的身份验证将导致 Endpoint Armor 无法按预期工作。为了保持无缝和有效的安全设置,请勿更改其他安全页面的设置,因为这样做可能会影响 Endpoint Armor 的正常功能。如果你有任何问题,请联系 支持 或在 Quicknode Discord 中询问。

设置 Endpoint Armor

首先,你需要一个可以访问所需网络的 QuickNode 终端。出于本教程的目的,我们将使用以太坊主网络;然而,其他受支持的链也适用相同的步骤。要检查所有受支持的链,请查看 Endpoint Armor 页面。

这里 注册一个免费账户。登录后,单击 创建一个终端 按钮,然后选择 Ethereum 链和 Mainnet 网络。

接下来,你需要将 Endpoint Armor 附加组件添加到你的终端。你可以在端点创建过程中执行此操作,或者在终端页面的 附加组件 选项卡中单击 探索 按钮来后续添加 Endpoint Armor 附加组件。

QuickNode Endpoint Add-ons

启用附加组件后,你将在附加组件选项卡中看到它。

配置你的设置

现在,让我们开始给终端添加一些限制。

启用附加组件后,找到 附加组件 选项卡中的 Endpoint Armor,点击 ( ),并选择 仪表板 打开 Endpoint Armor 的配置页面。

Endpoint Armor Dashboard

打开 Endpoint Armor 页面,选择你想要的终端。你将看到一个 安全的 RPC URL。你对该安全终端 URL 的所有 Endpoint Armor 配置将生效。欢迎你在开发中使用此端点 URL。

你可以通过组合任何 endpointRateLimitsvisitorRateLimitsmethodRateLimits 设置或仅选择实现其中之一,为你的终端创建自定义配置。

第 1 步:指定允许的方法

由于 Endpoint Armor 默认会阻止所有未明确提到的方法,第一步应为指定允许的方法。

示例用例

  • 你的 dApp 需要 eth_calleth_chainIdeth_getLogseth_gasPriceeth_blockNumber 方法,以在前端显示必要信息并使用户能够发送交易。
  • 你想为 eth_blockNumber 设置唯一的速率限制,以允许每秒一次请求。
  • 你不想为其他方法设置唯一的速率限制;然而,你想为终端设置全局速率限制。我们将在接下来的步骤中进行讨论。
  • 你想将 eth_getLogs 查询限制为最新的 100 个区块。
  • 你只希望 eth_call 请求能发送至 USDT 合约(以太坊主网络上的 0xdAC1...1ec7)和 USDC 合约(以太坊主网络上的 0xA0b8...eB48)。

以下是启用这些方法限制的示例配置。

{
    "methods": {
        "eth_call": {
            "contractAllowlist": [\
                "0xdAC17F958D2ee523a2206206994597C13D831ec7",\
                "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"\
            ]
        },
        "eth_chainId": "enabled",
        "eth_getLogs": {
            "latestBlocks": 100
        },
        "eth_gasPrice": "enabled",
        "eth_blockNumber": {
            "reqPerSecond": 1
        }
    }
}

第 2 步:设置全局速率限制

除了特定方法的速率限制外,你还可以设置全局速率限制,即在特定时间段内可发送的最大请求数, 通过配置标准速率限制选项来为你的终端设置全局速率限制。

继续示例用例

  • 你想设置每分钟 200 次请求的全局速率限制。因此,当达到 200 次请求后,系统将在下一分钟前返回错误。
{
    "methods": {
        "eth_call": {
            "contractAllowlist": [\
                "0xdAC17F958D2ee523a2206206994597C13D831ec7",\
                "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"\
            ]
        },
        "eth_chainId": "enabled",
        "eth_getLogs": {
            "latestBlocks": 100
        },
        "eth_gasPrice": "enabled",
        "eth_blockNumber": {
            "reqPerSecond": 1
        }
    },
    "endpointRateLimits": {
        "reqPerMinute": 200
    }
}

第 3 步:实现访客特定的速率限制

此部分设置每个 独特访客 到网站的速率限制,这对于包含浏览器头的请求至关重要,表明请求来自个人用户,而不是由服务器端操作生成。访客速率限制可以根据特定需求进行调整,灵活管理来自不同访客的流量。

继续示例用例

  • 你想设置每分钟 10 次请求的访客速率限制。

现在,让我们将访客速率限制添加到你的配置中。此设置确保特定访客每分钟仅能发送 10 次请求。如果超出此限制,后续请求将被阻止,直至下分钟。由于终端速率限制仍在适用,因此请记住它仍然有效。

{
    "methods": {
        "eth_call": {
            "contractAllowlist": [\
                "0xdAC17F958D2ee523a2206206994597C13D831ec7",\
                "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"\
            ]
        },
        "eth_chainId": "enabled",
        "eth_getLogs": {
            "latestBlocks": 100
        },
        "eth_gasPrice": "enabled",
        "eth_blockNumber": {
            "reqPerSecond": 1
        }
    },
    "endpointRateLimits": {
        "reqPerMinute": 200
    },
    "visitorRateLimits": {
        "reqPerMinute": 10
    }
}

总结

快速回顾一下,这里是摘要表。

速率限制 特定限制
终端最大请求 200 次请求/分钟
访客最大请求 10 次请求/分钟
允许的方法
eth_call 无特定限制 仅允许合约
eth_chainId 无特定限制
eth_getLogs 无特定限制 仅最新的 100 个区块
eth_gasPrice 无特定限制
eth_blockNumber 1 次请求/秒

测试你的设置

在了解了更多关于配置的信息后,让我们测试 Endpoint Armor 是否按预期工作。通过遵循以下 JSON 配置修改你的配置,此配置将 eth_call 方法的请求限制为每小时最多 5 次请求,并且仅允许调用合约地址为 0xdAC17F958D2ee523a2206206994597C13D831ec7

总结:

  • eth_call 以外的方法不允许,
  • 尝试与配置中其他合约交互的请求不允许,
  • 超过每小时 5 个请求的操作不被允许。
{
    "methods": {
        "eth_call": {
            "reqPerHour": 5,
            "contractAllowlist": ["0xdAC17F958D2ee523a2206206994597C13D831ec7"]
        }
    }
}

不允许的合约

现在,打开你的终端,复制下面的代码,将 YOUR_ENDPOINT_ARMOR_HTTP_URL 替换为你的安全终端 URL,然后运行代码。

在此调用中,你将向 0x6b175474e89094c44da98b954eedeac495271d0f 合约地址发送 eth_call,此地址在配置中不被允许。这个代码会发送请求调用 name() 函数。

curl YOUR_ENDPOINT_ARMOR_HTTP_URL \
-X POST \
-H "Content-Type: application/json" \
--data '{"method":"eth_call","params":[{"to":"0x6b175474e89094c44da98b954eedeac495271d0f","data":"0x06fdde03"}],"id":1,"jsonrpc":"2.0"}'

运行代码后,你将得到类似于以下的结果,因为该合约不被允许。

{"error":"Blocked by QuickNode Endpoint Armor: contract is not allowed"}

允许的合约

现在,改变合约地址,再次尝试调用 name() 函数。将 YOUR_ENDPOINT_ARMOR_HTTP_URL 替换为你的安全终端 URL,然后运行代码。

curl YOUR_ENDPOINT_ARMOR_HTTP_URL \
-X POST \
-H "Content-Type: application/json" \
--data '{"method":"eth_call","params":[{"to":"0xdAC17F958D2ee523a2206206994597C13D831ec7","data":"0x06fdde03"}],"id":1,"jsonrpc":"2.0"}'

结果将如下所示。此结果可能看起来没有意义,但它是 Tether USD 的十六进制值。我们只是获取 USDT 合约的名称。

{"jsonrpc":"2.0","id":1,"result":"0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a5465746865722055534400000000000000000000000000000000000000000000"}

速率限制

目前,contractAllowlist 限制按预期工作。现在,是时候尝试速率限制了。由于我们的限制是每小时 5 次请求,因此在前 5 次请求后,你应收到一个错误,类似于以下内容。

{"error":"Blocked by QuickNode Endpoint Armor: Too many total requests for method"}

禁用的方法

由于唯一允许的方法是 eth_call,尝试调用其他方法后,你应收到一个错误。在将你的终端替换为占位符后,运行以下代码,以调用 eth_chainId 方法。

curl YOUR_ENDPOINT_ARMOR_HTTP_URL \
-X POST \
-H "Content-Type: application/json" \
--data '{"method":"eth_chainId","params":[],"id":1,"jsonrpc":"2.0"}'

结果应与以下内容类似。

{"error":"Blocked by QuickNode Endpoint Armor: Method disabled"}

创建并测试与安全终端交互的 React 应用

本指南的这一部分将指导你创建一个简单的 React 应用程序,该程序通过使用 ethers.js 的安全终端与区块链进行交互。此设置对于前端应用程序尤为 重要,因为它确保你的普通 QuickNode 终端 URL 不会被暴露,并 保持受保护,从而减少未经授权访问和攻击的风险。

请将你的安全终端 URL 保留在手边,因为在本部分开发过程中将需要。若还未启用 Endpoint Armor,请查看 设置 Endpoint Armor 部分。

在继续之前,将当前的 Endpoint Armor 配置更改为以下配置。

{
    "methods": {
        "eth_call": {
            "contractAllowlist": ["0xdAC17F958D2ee523a2206206994597C13D831ec7"]
        }
    },
    "visitorRateLimits": {
        "reqPerMinute": 3
    }
}

info

在接下来的 React 示例中,我们将使用以太坊主网网络合约地址的 USDT 和 DAI。如果你打算使用不同的网络,请确保根据需要更改合约地址。

第 1 步:通过运行以下命令创建一个新的 React 应用:

npx create-react-app my-secured-app

第 2 步:导航到应用程序的目录:

cd my-secured-app

第 3 步:安装 ethers.js 和 dotenv:

npm install ethers dotenv

第 4 步:在项目根目录下创建一个 .env 文件,并添加你的安全 QuickNode 终端 URL:

REACT_APP_QUICKNODE_ENDPOINT="YOUR_ENDPOINT_ARMOR_HTTP_URL"

第 5 步:修改 src/App.js 文件,如下所示以创建用户界面。

import React, { useState } from 'react'
import './App.css'
import { ethers } from 'ethers'

function App() {
    // 用于计数调用和存储结果及错误的状态变量
    const [tetherCallCount, setTetherCallCount] = useState(0)
    const [daiCallCount, setDaiCallCount] = useState(0)
    const [tetherResult, setTetherResult] = useState('')
    const [daiResult, setDaiResult] = useState()

    // 使用 .env 中的 QuickNode 终端初始化 ethers 提供者
    // 如果使用以太坊以外的其他网络,请修改 ethers.Network.from() 内容。
    const provider = new ethers.JsonRpcProvider(
        process.env.REACT_APP_QUICKNODE_ENDPOINT,
        ethers.Network.from('mainnet'),
        { staticNetwork: true }
    )

    // Tether 和 DAI 的合约地址
    // 如果使用以太坊以外的其他网络,请更新合约地址。
    const contractAddresses = {
        tether: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
        dai: '0x6B175474E89094C44Da98b954EedeAC495271d0F',
    }

    // 两个合约的通用 ABI,专门用于 'name' 函数
    const contractABI = [\
        {\
            constant: true,\
            inputs: [],\
            name: 'name',\
            outputs: [{ name: '', type: 'string' }],\
            payable: false,\
            stateMutability: 'view',\
            type: 'function',\
        },\
    ]

    // 为 Tether 和 DAI 创建 ethers 合约实例
    const tetherContract = new ethers.Contract(
        contractAddresses.tether,
        contractABI,
        provider
    )

    const daiContract = new ethers.Contract(
        contractAddresses.dai,
        contractABI,
        provider
    )

    // 处理对 Tether 合约的调用的函数
    const handleTetherCall = async () => {
        try {
            setTetherResult('')
            setTetherCallCount(prevCount => prevCount + 1)

            const data = await tetherContract.name()
            setTetherResult(data)
        } catch (error) {
            console.error(error)
        }
    }

    // 处理对 DAI 合约的调用的函数
    const handleDaiCall = async () => {
        try {
            setDaiResult('')
            setDaiCallCount(prevCount => prevCount + 1)

            const data = await daiContract.name()
            setDaiResult(data)
        } catch (error) {
            console.error(error)
        }
    }

    return (
        <div>
            <button onClick={handleTetherCall}>调用 Tether 合约</button>
            {tetherResult && <p>结果: {tetherResult}</p>}
            <p>调用请求计数器: {tetherCallCount}</p>
            <button onClick={handleDaiCall}>调用 DAI 合约</button>
            {daiResult && <p>结果: {daiResult}</p>}
            <p>调用请求计数器: {daiCallCount}</p>
        </div>
    )
}
export default App

第 6 步:根据以下内容修改 src/index.css 文件以添加样式。

/* 全局样式 */
body {
    font-family: 'Arial', sans-serif;
    background-color: #f4f4f4;
    margin: 0;
    padding: 0;
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
}

/* 应用容器 */
.App {
    text-align: center;
    background-color: #fff;
    padding: 20px;
    border-radius: 8px;
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}

/* 按钮 */
button {
    background-color: #007bff;
    color: white;
    padding: 10px 15px;
    border: none;
    border-radius: 4px;
    cursor: pointer;
    margin-right: 10px;
    font-size: 16px;
    transition: background-color 0.3s;
}

button:hover {
    background-color: #0056b3;
}

/* 用于计数器和错误消息的段落 */
p {
    color: #333;
    font-size: 16px;
    margin-top: 15px;
}

第 7 步:启动你的 React 应用。

npm start

应用现在应在 http://localhost:3000 上运行。你可以与按钮交互,并查看计数器和错误消息。

React App

由于我们将 eth_calls 限定为仅对 Tether 的合约,因此 调用 Tether 合约 按钮正常工作,并按预期返回结果,而 调用 DAI 合约 则引发错误,因为它在配置中不被允许。

另外,在每分钟发送 3 次请求后,甚至调用 Tether 的合约也会引发错误,直到下分钟,因为我们设置了访客速率限制为 3 次请求/分钟。

React App With Errors

info

为了监控与终端相关的错误,推荐查看浏览器的开发者控制台。

在 Chrome 浏览器中打开开发者控制台窗口,请使用键盘快捷键 Windows/Linux上使用 Ctrl-Shift-J,或在 Mac 上使用 Cmd-Option-J。

为什么 Endpoint Armor 有用

Endpoint Armor 是在你当前的安全设置(如身份验证Token、JWT、IP 和引用网址白名单等)之上增加的额外安全层。Endpoint Armor 使你能够定义速率限制和智能合约函数白名单,从而将终端使用限制为仅授权活动。

通过设置速率限制,它防止了对你的终端的不必要使用,通过智能合约函数白名单,能够保护特定交易(如 DeFi 应用中的资金转移)免受未经授权的访问。

结论

总之,使用 Endpoint Armor,以及其多功能配置,如方法特定的速率限制、全局速率限制和合约白名单,为你的区块链终端提供了强大而有效的安全层。它使你能够精准管理访问和控制流量,确保你的终端保持安全、响应迅速且得到优化。实施这些功能不仅增强了对未经授权访问和潜在攻击的安全性,还确保了区块链应用的稳定和高效运行,从而最终增强你服务的可靠性和可信度。

订阅我们的 新闻通讯,获取更多有关 Web3 和区块链的文章和指南。如果你有任何问题或需要进一步的帮助,请随时加入我们的 Discord 服务器或使用下面的表单反馈。通过关注我们的 Twitter(@QuickNode)和我们的 Telegram 通告频道,及时了解最新消息。

我们 ❤️ 反馈!

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

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

0 条评论

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