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

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

thinkPHP3.2.3 中伪造表单的一种示例及解决方法_第1张图片

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

thinkPHP3.2.3 中伪造表单的一种示例及解决方法_第2张图片


thinkPHP3.2.3 中伪造表单的一种示例及解决方法_第3张图片

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

thinkPHP3.2.3 中伪造表单的一种示例及解决方法_第4张图片


thinkPHP3.2.3 中伪造表单的一种示例及解决方法_第5张图片

解决方法:

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`;)再尝试,结果如下:

thinkPHP3.2.3 中伪造表单的一种示例及解决方法_第6张图片

thinkPHP3.2.3 中伪造表单的一种示例及解决方法_第7张图片

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

相应的模型内部定义:

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)){ ... }







你可能感兴趣的:(PHP)