写在开始前---表单数据校验
为什么要校验?
恶意操作数据,数据格式不符合数据库业务要求。
校验哪些方面规则?
是否字段存在;
是否必填;
是否长度适合;
是否在某个范围,是否特定值;
是否特定类型:整数,数字,全字符,字符数字组合,汉字,其他组合;
是否特定格式:电话,url,邮箱,ip,时间日期,mac地址,id卡,ic卡;
根据预设类型,设置判断条件及错误信息。比如:
邮箱有@,手机号全11位数字等。
哪里校验?
web前端校验,后端也要校验,甚至数据库也可以,比如存储过程(注意注入问题)。前端较快,用户体验好,但可以越过,后端在服务器接收到表单入库前再进行一次校验。对于业务来说,前端可以没有,但是后端必须要有。某些场景下,用存储过程更好。
参数传递校验模式
透传模式: 透传模式下,API网关除Path位置的请求参数外,不对其他位置的请求参数进行映射与校验,用户参数会透明传递给后端,详细请阅读章节2. 透传模式。
映射模式: 映射模式下,API网关会根据用户配置的所有参数执行校验与映射,如果客户端传递了未在配置中的参数,参数将会被API网关过滤掉,不会转发给后端,详细请参考章节3. 映射模式。
透明映射模式: 类似映射模式,但在透明映射模式下,如果用户传递了未配置的参数,参数会被透明转发给后端,详细请参考章节4. 透明映射模式。
参考:https://help.aliyun.com/document_detail/154721.html
根据实际情况需要选择哪种参数传递模式,再和校验功能合并,获取一个有效的表单及其数据键值。
校验原理?
正则表达式?是一个好东西,对于文本的处理非常方便,比如查找替换格式匹配等。看了几个参数校验相关库,每一个都有正则表达式的影子。语言内部能处理语言本身定义好的类型,但是粗粒度,配合正则一起达到校验的目的。
项目结构与校验方式
根据项目的特点,选择校验的书写的方式。成品项目,在控制层接到参数,在控制层校验,这里可以使用各种第三方库包,面向对象面向过程式都可以。如果是可定制修改项目,参数的格式信息和对应的不匹配错误提示信息要配置在数据库。控制层收到参数,还要查询数据库,然后做校验。这个时候,首先要设计配置数据的格式,方便存储和读取解析,再或者干脆在存储过程校验。
表单重复提交
重复提交可以在前端拦截,比如提交完按钮禁用,或生成表单唯一id缓存,提交前校验下。前端可越过,还是靠后端校验稳妥。后端可以接收表单数据及表单id,session会话或redis里缓存该表单id和接收时间,下次提交时,拿表单id和时间与会话或redis里的比对,id匹配且未超过设置的时间间隔即为重复提交。
![](https://files-cdn.cnblogs.com/files/thingk/%E5%BE%AE%E4%BF%A1%E6%94%B6%E6%AC%BE%E7%A0%81.bmp)