一般最佳实践
验证与安全相关的查询响应
安全问题
对响应 query calls(与更新调用相反)不是由容器/子网进行阈值签名的。 因此,单个恶意副本或边界节点可能会更改数据,从而违反其真实性。 如果更新调用依赖于对查询调用的响应,这尤其危险。
推荐
-
所有需要真实性保证的与安全相关的查询响应数据(这需要针对每个 dApp 进行评估)都应由 IC 使用认证变量进行认证。 考虑使用现有的数据结构,例如certified-map。 数据认证必须在前端进行验证。
-
或者,这些调用必须由调用者作为更新调用发出(例如在 agent-js 中),但这会影响性能:它需要几秒钟。 请注意,每个查询也可以由调用者作为更新发出。
-
示例是财产证明Internet Identity, NNS dApp, or the canister signature implementation in Internet Identity.
非特定于互联网计算机
本节中的最佳实践非常笼统,并不特定于 Internet 计算机。 此列表绝不是完整的,仅列出了过去导致问题的一些非常具体的问题。
不要使用有已知漏洞的第三方组件
安全问题
使用易受攻击和过时的组件是一个big security risk.
推荐
-
根据已知漏洞的数据库定期检查您的第三方组件:
-
Rust: use cargo audit.
-
JavaScript / NPM: use npm audit
-
这应该集成到构建过程中,如果存在已知漏洞,构建应该会失败。
-
不要使用未维护且可能不可信的存储库的分叉版本。
-
避免使用未广泛使用且可能没有经过充分(理想情况下是第三方)审查的第三方组件。
-
固定您正在使用的组件的版本,以避免自动切换到损坏的更新。
不要自己实现加密
推荐
-
使用可能是开源的并且已经被许多人审查过的知名库。例如,在 JavaScript 中使用 Web Crypto API,使用 crates 如rust实现的sha256
测试你的代码
推荐
为容器实现和前端代码编写测试,尤其是安全相关属性和不变量。
-
在Effective Rust Canisters: 测试升级,make code target-independent
-
对于 wasm 级别的单元测试,考虑使用Motoko Matchers
-
对于 Motoko 级别的单元测试,请考虑Canister 模块。还有一些示例测试这里和 这里。作为示例,另请参见端到端测试和单元测试invoice-canister。
-
对于长时间运行的测试场景,考虑Motoko BigTest