主要观点:Rust 虽被称为“安全语言”,但仅内存安全远远不够,安全的 Rust 代码仍有诸多易被忽视的问题。
关键信息:
- 安全 Rust 中的常见陷阱,如整数溢出、类型转换错误、数组越界等,编译器有时无法检测到。
- 介绍多种避免这些陷阱的方法,如使用检查算术运算、合适的类型转换方式、有界类型等。
- 提及一些与安全相关的 Rust 特性和工具,如
cargo-geiger
检查依赖中的不安全代码,clippy
可在编译时捕获诸多问题。
重要细节: - 整数溢出在 Rust 中可通过使用检查算术运算避免,可在
Cargo.toml
中开启释放模式下的溢出检查。 as
用于数字转换有风险,应优先使用From::from()
和TryFrom
。- 用有界类型表达不变量可避免无效状态,如
std::num::NonZeroUsize
。 - 数组索引和切片操作要进行边界检查,避免使用
get
方法替代。 - 对包含敏感信息的类型要谨慎实现
Debug
,可使用secrecy
crate 或手动处理。 - 序列化时要注意避免敏感数据泄露,可自定义序列化和反序列化方法。
- 防止 TOCTOU 漏洞要先打开目录再进行检查。
- 处理敏感数据使用常量时间比较。
- 避免接受无界输入,设置请求体的大小限制。
Path::join
处理绝对路径时可能会替换相对路径。
总结:Rust 安全编程需注意诸多细节,借助相关工具和方法可有效避免常见问题,同时结合其他安全措施可提升代码的 robustness。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。