thinkPHP3.2.3 中伪造表单的一种示例及解决方法

来源:互联网 发布:美国劳工部就业数据 编辑:程序博客网 时间:2024/06/07 02:30

在提交往数据库插入数据的表单的时候,如果不对表单字段进行过滤(限制),就容易被利用浏览器的开发调试工具对个别字段进行改名从而破坏数据库的内部数据,如下简单例子所示:


将表单的goods_desc字段改为id后将其之类最大值再提交表单数据:(因为此表id字段类型为mediumint所以写上其最大值)




上述操作之后再往数据库添加数据就会报错,因为 id 已经是该类型的最大值了,没法增加了。




解决方法:

thinkPHP3.2.3 内置了解决方案:

在模型中进行验证,定义protected $insertFields = "允许接收插入数据库的字段1,字段2,...",从而当你在控制器执行create()方法收集表单数据时就会严格依据 $insertFields 规定的字段来收集数据,不在范围内的字段直接过滤(无视)。



使用 create() 方法可以自动收集表单数据,第一个参数是数据,第二个参数为1时代表此表单是新增数据的表单(默认无 id 即添加操作),为2时代表此表单是修改数据的表单(默认通过表单是否含有隐藏域 id 判断)。

修改之后把表的 id 重置为1(update `tableName` set auto_increment=1;)或者直接清空表(truncate table `tableName`;)再尝试,结果如下:



同理,当你提交修改数据的表单时,以上应该修改为:

相应的模型内部定义:

protected $updateFields = 'id, goods_name,price,goods_desc,is_on_sale';

相应的控制器内部判断:

$goods = D('Goods'); //M('model');=>实例化父类model,无自定义model时使用;D('model');=>实例化自定义的model类。

if($goods->create(I('post.'),2)){ ... }







原创粉丝点击