首页 理论教育使用ThinkPHP表单令牌实现数据来源校验和防止跨站提交

使用ThinkPHP表单令牌实现数据来源校验和防止跨站提交

【摘要】:表单令牌是一项非常实用的技术,它使用服务器的Session功能,实现对表单数据来源的检测及校验,防止数据被伪造和篡改。ThinkPHP提供的表单令牌功能很好地解决了数据来源校验,防止跨站提交。图8-1 表单令牌验证过程表单令牌默认已经开启,默认情况下生成的表单令牌使用随机HASH字符串,并且字段名称为__HASH__,如以下代码所示。上述代码中,定义了2个表单,因为只有form2表单定义了{__TOKEN__}标识,所以只有该表单存在表单令牌。

表单令牌是一项非常实用的技术,它使用服务器的Session功能,实现对表单数据来源的检测及校验,防止数据被伪造和篡改。传统的表单提交一般使用权限功能来检测。例如在留言系统中,当用户提交留言数据时,后台的程序首先会启动基本的数据校验程序,例如数据是否为空,某个字段是否填写正确等,如果一切符合条件,则允许提交,否则终止操作。

假设用户在站外,例如本地上模拟同样的数据提交给服务器,由于没有做表单验证功能,所以这些数据也会被提交,这无疑给网站留下了隐式的安全隐患,就算是使用传统的会员权限来判断,如果没有数据来源验证,也是不可靠的(用户可以通过修改head等信息实现cookie欺骗)。

ThinkPHP提供的表单令牌功能很好地解决了数据来源校验,防止跨站提交。当表单令牌开启后,在存在表单的视图中会生成随机令牌(默认为随机的MD5字符串)。当数据被保存到数据库前,开发人员可以使用Session对令牌进行校验,如图8-1所示。

978-7-111-42852-7-Part02-283.jpg

图8-1 表单令牌验证过程

表单令牌默认已经开启,默认情况下生成的表单令牌使用随机HASH字符串,并且字段名称为__HASH__,如以下代码所示。

978-7-111-42852-7-Part02-284.jpg

如上述代码所示,当系统视图引擎遇到form标签时,就会在表单后面追加表单令牌,如果需要关闭,可以在当前动作中配置C('TOKEN_ON',false)。表单生成后,就可以在动作中验证表单来源了,如以下代码所示。(www.chuimin.cn)

978-7-111-42852-7-Part02-285.jpg

__HASH__是默认生成的隐藏字段名,开发人员可以通过配置文件进行更改。此外,表单令牌的加密方式等都是可以自定义的,如以下代码所示。

978-7-111-42852-7-Part02-286.jpg

需要注意的是,如果一个页面中存在多个表单,那么只能有一个表单存在令牌。多个表单时,使用{__TOKEN__}标识令牌生成区,如以下代码所示。

978-7-111-42852-7-Part02-287.jpg

上述代码中,定义了2个表单,因为只有form2表单定义了{__TOKEN__}标识,所以只有该表单存在表单令牌。