С «Случай окисления: язык программирования Rust» Серхио Бенитес говорит,
Вот статический файловый сервер, написанный на Rocket.Это ровно четыре строки, и он гарантированно не будет уязвим для атак со стороны каталога.
Эти четыре строки:
#[get("/<path..>")]
fn files(path: PathBuf) -> Option<NamedFile> {
NamedFile::open(Path::new("static/").join(path)).ok()
}
В нижней части этогоСлайд говорит:
FromParam*
реализация для PathBuf
проверяет безопасность пути
Я понимаю, как тип может гарантировать безопасность путем проверки ввода (в том же смысле, что любойобъект может быть в конструкторе или как входные данные для функции могут быть обернуты с помощью проверяющей функции.
dangerousThing(validateSafety(input))
Многие языки предоставляют это. Я также понимаю, как можно упростить это, поместив его в конструктор длятип или класс,
class Path {
constructor(path) { this._path = validateSafety(path) }
}
Но я в замешательстве из-за того, что (если что-то) Руст делает здесь по-другому. Есть ли что-нибудь еще к этому?