为什么要在后端验证post请求和数据库模式



摘要:如果我可以使用猫鼬模式验证数据,我应该使用express验证器吗

我是一名前端开发人员,通常在提交之前对表单进行一些验证。现在,我开始学习快递了。

我做的第一件事是接收一个表单,并使用一个名为express validator的库对其进行验证,然后完成数据库操作。很简单,没什么大不了的。然而,在自己做了一个项目后,我意识到mongoose本身可以处理错误,不仅如此,而且很容易在前端返回这些错误,尤其是在api的情况下。

这就是我的疑问,为什么要多次验证这些数据?我知道数据库模式不仅仅是为了做到这一点,而且在前端和后端做两次这些事情会导致太多重复,可能有点难以维持。

下面的几行代码只是为了说明这个案例。不要评判我,我还在学习。

import mongoose from "mongoose";
const TaskSchema = new mongoose.Schema({
name: {
type: String,
required: true,
trim: true,
maxlength: 20,
},
description: {
type: String,
required: false,
},
completed: {
type: Boolean,
default: false,
},
date: {
type: Date,
default: Date.now,
},
});
export default mongoose.model("Task", TaskSchema);
import taskModel from "../models/tasksModel";
export function createTask(req: express.Request, res: express.Response) {
taskModel
.create(req.body)
.then((task) => res.status(201).send(task))
.catch((err) => res.status(400).send(err));
}

问题是您有基本需求和业务需求。也就是说,通过声明数据库表(集合(、其属性、数据类型、约束等,可以设置基本的数据结构。但您也可能有额外的业务需求,这些需求可能不在数据库语法中。

例如,您有作为对象数组的输入,然后应该将其保存到数据库中。可能您希望防止传递重复的对象。

根据不同的条件(用户角色、权限等(,您的数据可以通过不同的验证模式进行验证。

此外,验证输入并将其作为DTO传输到应用程序的各个层、模块和组件也是一种常见的情况。

最后但同样重要的是,SQL注入可以通过简单地"消耗"数据库未验证的数据来实现。

在前端,每个用户都使用自己的应用程序副本,该副本运行在一台笔记本电脑上,并接受来自本地系统或已知web资源的输入。

在后端,所有用户都使用一个在共享基础设施上运行并接受互联网输入的应用程序。

服务器端验证是确保数据完整性和安全性所必需的,因为您无法控制HTTP请求来自何处以及它们提供的有效负载。如果您的api是从脚本中调用的,那么即使是合法的客户端也可能缺乏客户端验证。无效或恶意请求可能影响所有用户。数据丢失可能无法恢复。

客户端验证是可选的,可以改善用户体验,并对无效输入提供即时反馈-您可以节省HTTP往返,并可以在整个表单完成并提交到服务器之前隔离验证字段。安全方面的客户端应用程序只影响当前用户,并且可以通过重新加载网页始终恢复到初始状态。

最新更新