php 表单数据逻辑验证问题

假如
1 某用户有删除权限,但他修改 前端脚本发送本应不属于他的id,那么他就有删除整个数据库的能力。
2 假如某个用户添加商品时选择数据库没有的商品类型(就是构建请求时修改参数)
3 又或者本来只有 男女 的枚举 field ,但用户却发送了除此之外的数据,例如人妖

这些数据大多是int tinyint 类型的,能穿透常规的表单验证,如是否数字啊,长度啊,是否为邮箱格式之类的

那么就要写逻辑验证,但操作一多,数据表字段的关联性字段一多,便会增加 大量代码,有没有更好的办法能解决,或者一些已经做好的轮子参考呢?

阅读 4.3k
5 个回答

一般php框架都有封装好一套自己的表单验证方法,比如yii2 laravel都有validate表单验证功能,直接拿来用就行了。
如果框架没有可以自己封装一些常用的验证方法,或者github找现成的validate轮子:
Validation
valitron

一般验证分两种:
1、数据类型格式范围验证,这个比较简单,一般放在逻辑处理的最前面验证,mvc框架都有这个,轮子比较多。
2、逻辑、权限等的验证,这些一般是掺杂在逻辑处理过程中,比如你说的删除权限,不存在的商品类型,这是在逻辑处理中必须要做的,这种一般没有轮子,但可以自己写的多处复用。

前端 有写好的一些前端框架验证, 比如 妹子UI 的 js 验证, H-ui 的前端js验证 都是对表单的数据进行验证, 后端框架 laravel 对 request写好的 validate验证 都有 或者你 也可以写一个公共验证类 注入进来 就可以了

这种情况分两步:
1.前端验证,如果你只是做做后台验证也麻烦你的告诉一下前端,一些常规的验证比如名字不能输引号啊,过滤掉空格;手机必须是11位还对手机号的合法性做一下校验。就是让前端把力所能及的判断做掉。
2.后端验证
①数字的合法性以及合法范围,比如你要求1-3那么他不可能出现4,比如你要求了男女、保密,那么出现人妖就是非法的,性别这个用tinyint会很好控制。
②你说的删除问题,如果你的后端真的靠一个id就能执行删库这种操作,那后端的安全性太让人捉急了,最少搞个密码验证,token验证啥的吧。
③商品添加问题,商品应该是有分类的吧,只有选择了分类才能添加商品,好像从没有自己填写商品的类型的。你也说了有数据库商品类型,那为什么不显示给他让他选择了。给客户做一个选择,就少了很多出错的机会,如果给客户自由发挥,那么各种奇怪的bug都可能有

反正,永远不要相信客户的输入,多少年来不变的真理

楼主所说的问题,涉及两个方面:

  1. 权限控制问题;

  2. 数据过滤问题;

1. 权限控制问题

不好的做法:根据前端发送的 id 来判断。
建议做法:基于登陆状态的用户角色来做控制,比如:基于角色的权限访问控制 (RBAC)
其中,登陆状态应该通过 cookie - session 机制来判断。
参考:Cookie/Session机制详解

2. PHP 数据过滤

可以使用 PHP 现有的函数扩展完成,可以使用特定的过滤器过滤一个变量。
比如过滤邮箱:

<?php
var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));
var_dump(filter_var('http://example.com', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED));

// 输出结果如下
string(15) "bob@example.com"
bool(false)

参考:

clipboard.png

具体的过滤器类型可以参考:Validate filters

但是,如果要判断变量是否在一个指定范围的集合内 (eg. in_array),就需要自行写判断方法,如果是多个地方类似的判断,可以抽象成一个统一的方法,来降低代码量。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题