问题描述
我的网络应用程序将收到大量用户生成的内容。我想通过验证用户生成的输入来提高基本安全性。我的后端正在运行 Node+Express。
我应该如何实现输入验证?
-
用断言? 从 Python 开始,我开始编写 assert 语句: 断言(标题.长度> 0)
-
使用快速验证器? 然后我发现有表单验证库,比如express-validator。这似乎是“正确”的做法。但与简单的断言语句相比,实际上我需要编写的代码行数似乎也增加了一倍或三倍。
-
使用打字稿? 然后我意识到也许我可以用 TypeScript 编写一些我的 Node 代码,它会为我做所有的验证。
-
?
我应该使用哪种方法?
解决方法
您应该做的第一件事是清理用户输入以防止 XSS。 有很多 NPM 包可以用于此目的,DOMPurify 做得很好。
验证输入的最基本方法是使用 if 语句,例如:
app.post("/user",(req,res) => {
const { email,password } = req.body;
if (!email || !validator.isEmail(email)) {
return res.status(400).send("Invalid email");
} else if (!password || password.length < 8) {
return res.status(400).send("Invalid password");
}
// Do stuff
return res.sendStatus(200);
});
验证库非常有用,在上面的示例中,我使用了 isEmail
中的 validator
函数。
请注意,TypeScript 不执行任何运行时验证,它在编译时执行类型检查,然后将整个 TypeScript 代码编译为 JavaScript,剥离所有类型。
这意味着,例如,即使您在 TypeScript 中指定为字符串的字段在运行时结果为数字,JavaScript 也不会抛出任何错误,因此确保每个输入字段已验证。
验证每个请求中的每个输入可能会变得非常重复和难看,但幸运的是,您可以实现 Express middlewares,您可以轻松地将其添加到需要它们的请求中。