我应该如何在后端验证我的输入?

问题描述

我的网络应用程序将收到大量用户生成内容。我想通过验证用户生成的输入来提高基本安全性。我的后端正在运行 Node+Express。

我应该如何实现输入验证?

  1. 用断言? 从 Python 开始,我开始编写 assert 语句: 断言(标题.长度> 0)

  2. 使用快速验证器? 然后我发现有表单验证库,比如express-validator。这似乎是“正确”的做法。但与简单的断言语句相比,实际上我需要编写的代码行数似乎也增加了一倍或三倍。

  3. 使用打字稿? 然后我意识到也许我可以用 TypeScript 编写一些我的 Node 代码,它会为我做所有的验证。

  4. ?

我应该使用哪种方法

解决方法

您应该做的第一件事是清理用户输入以防止 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,您可以轻松地将其添加到需要它们的请求中。