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

本文介绍了thinkPHP3.2.3中如何防止表单伪造,通过设置$insertFields和$updateFields属性,确保插入和更新操作仅限于指定字段。当表单字段被恶意篡改,如将goods_desc改为id并插入最大值时,会导致错误。解决方案是利用模型的验证功能,仅允许特定字段的数据入库,从而增强应用的安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


将表单的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)){ ... }







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值