开发后端时,是否要相信前端数据不会越界,减少一些数据校验
When developing the back-end, do you want to believe that the front-end data will not go out of scope, and reduce some data verification
在前后端分离开发的场景下,后端做的就是接收前端传来的数据,进行相应的处理,最后return 处理结果信息。
那么,对于前端发送的数据(无论是Get还是Post),我们是不是要保证它不会超出约束的范围,比如下面的例子
public class Apartment {
private Long id;
private String desc;
}
/**
* The entity relationship between room and apartment is that
* one apartment corresponds to multiple entities
*
* Each apartment has a different floor(field: floor)
* and the rooms on each floor have their serial number(field: sequence)
*
* (If I am in the 4th room on the 3rd floor, then my house number is 403)
*
**/
public class Room {
private Long id;
private String desc;
private Integer floor;
private Integer sequence;
private Long apartmentId;
}
然后,前端的房间显示是通过后台数据传过来的,也就是说后台知道哪些房间存在,哪些房间不存在。
比如3楼只有10个房间被系统录入,那么311-399房间可以稍后录入
现在前端发起了一个添加房间的入口请求,其数据格式是这样的
{
"desc":"Room-311",
"floor":3,
"sequence":11
"apartmentId":1
}
对于后端,是否需要执行额外的数据验证,即:
- 验证 apartmentId 是否存在,
- 验证楼层是否包含3层
- 验证第 3 层的序列包含 11
- 存储记录
但是如果我们选择相信前端传输的数据是“正确的”,
那么以上4步只需要做最后一步——插入记录即可。
现在的问题是我们是否愿意相信
前端传输的数据必须是“正确的”。
或者,我们什么时候选择不“信任”前端传输的数据,
但将其视为不受约束的随机数据请求(就像在测试中一样),
即使前端严格限制数据范围
(比如apartmentId和floor被锁定,当然这只是一个极端的假设)
互不信任是一个基本原则。错误可能由于多种原因而发生,因此作为后端开发人员,您永远不会相信传入信息的有效性,因此 front-end(可能程度较低)将不信任响应,并且还必须对其进行验证。
始终验证从客户端收到的数据,因为有些坏人总是试图在您的代码中寻找漏洞。
除了@Michael Gantman,我还要提到在后端进行数据有效性检查将允许您随时更改前端。对于不同的前端,您应该考虑通过纯 API 层调用后端。
在前后端分离开发的场景下,后端做的就是接收前端传来的数据,进行相应的处理,最后return 处理结果信息。
那么,对于前端发送的数据(无论是Get还是Post),我们是不是要保证它不会超出约束的范围,比如下面的例子
public class Apartment {
private Long id;
private String desc;
}
/**
* The entity relationship between room and apartment is that
* one apartment corresponds to multiple entities
*
* Each apartment has a different floor(field: floor)
* and the rooms on each floor have their serial number(field: sequence)
*
* (If I am in the 4th room on the 3rd floor, then my house number is 403)
*
**/
public class Room {
private Long id;
private String desc;
private Integer floor;
private Integer sequence;
private Long apartmentId;
}
然后,前端的房间显示是通过后台数据传过来的,也就是说后台知道哪些房间存在,哪些房间不存在。
比如3楼只有10个房间被系统录入,那么311-399房间可以稍后录入
现在前端发起了一个添加房间的入口请求,其数据格式是这样的
{
"desc":"Room-311",
"floor":3,
"sequence":11
"apartmentId":1
}
对于后端,是否需要执行额外的数据验证,即:
- 验证 apartmentId 是否存在,
- 验证楼层是否包含3层
- 验证第 3 层的序列包含 11
- 存储记录
但是如果我们选择相信前端传输的数据是“正确的”, 那么以上4步只需要做最后一步——插入记录即可。
现在的问题是我们是否愿意相信 前端传输的数据必须是“正确的”。
或者,我们什么时候选择不“信任”前端传输的数据, 但将其视为不受约束的随机数据请求(就像在测试中一样), 即使前端严格限制数据范围 (比如apartmentId和floor被锁定,当然这只是一个极端的假设)
互不信任是一个基本原则。错误可能由于多种原因而发生,因此作为后端开发人员,您永远不会相信传入信息的有效性,因此 front-end(可能程度较低)将不信任响应,并且还必须对其进行验证。
始终验证从客户端收到的数据,因为有些坏人总是试图在您的代码中寻找漏洞。
除了@Michael Gantman,我还要提到在后端进行数据有效性检查将允许您随时更改前端。对于不同的前端,您应该考虑通过纯 API 层调用后端。