- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章ThinkPHP令牌验证实例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
ThinkPHP内置了表单令牌验证功能,可以有效防止表单的远程提交等安全防护。 表单令牌验证相关的配置参数有:
。
1
2
3
|
'TOKEN_ON'
=>true,
// 是否开启令牌验证
'TOKEN_NAME'
=>
'__hash__'
,
// 令牌验证的表单隐藏字段名称
'TOKEN_TYPE'
=>
'md5'
,
//令牌哈希验证规则 默认为MD5
|
如果开启表单令牌验证功能,系统会自动在带有表单的模板文件里面自动生成以TOKEN_NAME为名称的隐藏域,其值则是TOKEN_TYPE方式生成的哈希字符串,用于实现表单的自动令牌验证.
自动生成的隐藏域位于表单Form结束标志之前,如果希望自己控制隐藏域的位置,可以手动在表单页面添加__TOKEN__ 标识,系统会在输出模板的时候自动替换。如果在开启表单令牌验证的情况下,个别表单不需要使用令牌验证功能,可以在表单页面添加__NOTOKEN__,则系统会忽略当前表单的令牌验证.
如果页面中存在多个表单,建议添加__TOKEN__标识,并确保只有一个表单需要令牌验证.
模型类在创建数据对象的同时会自动进行表单令牌验证操作,如果你没有使用create方法创建数据对象的话,则需要手动调用模型的autoCheckToken方法进行表单令牌验证。如果返回false,则表示表单令牌验证错误。例如: 。
。
1
2
3
4
5
|
$User
= M(
"User"
);
// 实例化User对象
// 手动进行令牌验证
if
(!
$User
->autoCheckToken(
$_POST
)){
// 令牌验证错误
}
|
在ThinkPHP框架的View.class.php里定义了一个公共的模板替换函数 。
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
protected
function
templateContentReplace(
$content
) {
// 系统默认的特殊变量替换
$replace
=
array
(
'../Public'
=> APP_PUBLIC_PATH,
// 项目公共目录
'__PUBLIC__'
=> WEB_PUBLIC_PATH,
// 站点公共目录
'__TMPL__'
=> APP_TMPL_PATH,
// 项目模板目录
'__ROOT__'
=> __ROOT__,
// 当前网站地址
'__APP__'
=> __APP__,
// 当前项目地址
'__UPLOAD__'
=> __ROOT__.
'/Uploads'
,
'__ACTION__'
=> __ACTION__,
// 当前操作地址
'__SELF__'
=> __SELF__,
// 当前页面地址
'__URL__'
=> __URL__,
'__INFO__'
=> __INFO__,
);
if
(defined(
'GROUP_NAME'
))
{
$replace
[
'__GROUP__'
] = __GROUP__;
// 当前项目地址
}
if
(C(
'TOKEN_ON'
)) {
if
(
strpos
(
$content
,
'{__TOKEN__}'
)) {
// 指定表单令牌隐藏域位置
$replace
[
'{__TOKEN__}'
] =
$this
->buildFormToken();
}
elseif
(
strpos
(
$content
,
'{__NOTOKEN__}'
)){
// 标记为不需要令牌验证
$replace
[
'{__NOTOKEN__}'
] =
''
;
}
elseif
(preg_match(
'/<\/form(\s*)>/is'
,
$content
,
$match
)) {
// 智能生成表单令牌隐藏域
$replace
[
$match
[0]] =
$this
->buildFormToken().
$match
[0];
}
}
// 允许用户自定义模板的字符串替换
if
(
is_array
(C(
'TMPL_PARSE_STRING'
)) )
$replace
=
array_merge
(
$replace
,C(
'TMPL_PARSE_STRING'
));
$content
=
str_replace
(
array_keys
(
$replace
),
array_values
(
$replace
),
$content
);
return
$content
;
}
|
上面的if(C('TOKEN_ON'))是对令牌验证的开启状态进行判断,若开启则调用buildFormToken()方法,$_SESSION[$tokenName] = $tokenValue; 其实就是给$_SESSION['__hash__']赋值。如果不想进行令牌验证,只要在页面的</form>之前加入{__NOTOKEN__}就行了,它会被函数替换成空.
在ThinkPHP的Model.class.php类里定义了令牌的验证函数 。
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
// 表单令牌验证
if
(C(
'TOKEN_ON'
) && !
$this
->autoCheckToken(
$data
)) {
$this
->error = L(
'_TOKEN_ERROR_'
);
return
false;
}
// 自动表单令牌验证
public
function
autoCheckToken(
$data
) {
$name
= C(
'TOKEN_NAME'
);
if
(isset(
$_SESSION
[
$name
])) {
// 当前需要令牌验证
if
(
empty
(
$data
[
$name
]) ||
$_SESSION
[
$name
] !=
$data
[
$name
]) {
// 非法提交
return
false;
}
// 验证完成销毁session
unset(
$_SESSION
[
$name
]);
}
return
true;
}
|
。
最后此篇关于ThinkPHP令牌验证实例的文章就讲到这里了,如果你想了解更多关于ThinkPHP令牌验证实例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是一名优秀的程序员,十分优秀!