PHP开发笔记's Archiver

fangzhen 发表于 2009-3-17 13:48

thinkphp中令牌的使用方法详解

1.首先要开启令牌功能
[color=#ff0000]config.php[/color]内添加如下:

[color=#dd0000]'TOKEN_ON'[/color][color=#007700]=>[/color][color=#0000bb]true[/color][color=#007700],  [/color][color=#ff8000]//使用令牌

[/color][color=#dd0000]'TOKEN_NAME'[/color][color=#007700]=>[/color][color=#dd0000]'think_html_token'[/color][color=#007700],    [/color][color=#ff8000]// 表单令牌名称,TP会在模板form内自动生成一个隐藏域,[b][color=#ff0000]域名[/color][/b]就是这个字符串

[/color][color=#dd0000]'TOKEN_TYPE'[/color][color=#007700]=>[/color][color=#dd0000]'md5'[/color][color=#007700],  [/color][color=#ff8000]//令牌加密方式,换用其他加密也可以[/color]


[color=#ff8000][color=black]2.生成令牌[/color][/color]
[list=1][*]
[color=#007700]protected function [/color][color=#0000bb]saveToken[/color][color=#007700](){[*]        [/color][color=#0000bb]$tokenType [/color][color=#007700]= [/color][color=#0000bb]C[/color][color=#007700]([/color][color=#dd0000]'TOKEN_TYPE'[/color][color=#007700]);[/color][color=#ff8000]//获取了config里的'TOKEN_TYPE'配置[*]        [/color][color=#0000bb]$token [/color][color=#007700]= [/color][color=#0000bb]$tokenType[/color][color=#007700]([/color][color=#0000bb]microtime[/color][color=#007700]([/color][color=#0000bb]TRUE[/color][color=#007700]));[/color][color=#ff8000]//这里用md5方法加密了时间,[*]        [/color][color=#0000bb]Session[/color][color=#007700]::[/color][color=#0000bb]set[/color][color=#007700]([/color][color=#0000bb]C[/color][color=#007700]([/color][color=#dd0000]'TOKEN_NAME'[/color][color=#007700]),[/color][color=#0000bb]$token[/color][color=#007700]);[*]    }[*]    [/color][color=#ff8000]// 验证令牌[*]    [/color][color=#007700]protected function [/color][color=#0000bb]isValidToken[/color][color=#007700]([/color][color=#0000bb]$reset[/color][color=#007700]=[/color][color=#0000bb]false[/color][color=#007700]){[*]        [/color][color=#0000bb]$tokenName   [/color][color=#007700]=  [/color][color=#0000bb]C[/color][color=#007700]([/color][color=#dd0000]'TOKEN_NAME'[/color][color=#007700]);[*]        if([/color][color=#0000bb]$_REQUEST[/color][color=#007700][[/color][color=#0000bb]$tokenName[/color][color=#007700]]==[/color][color=#0000bb]Session[/color][color=#007700]::[/color][color=#0000bb]get[/color][color=#007700]([/color][color=#0000bb]$tokenName[/color][color=#007700])){[*]            [/color][color=#0000bb]$valid[/color][color=#007700]=[/color][color=#0000bb]true[/color][color=#007700];[*]            [/color][color=#0000bb]$this[/color][color=#007700]->[/color][color=#0000bb]saveToken[/color][color=#007700]();[*]        }else {[*]            [/color][color=#0000bb]$valid[/color][color=#007700]=[/color][color=#0000bb]false[/color][color=#007700];[*]            if([/color][color=#0000bb]$reset[/color][color=#007700])    [/color][color=#0000bb]$this[/color][color=#007700]->[/color][color=#0000bb]saveToken[/color][color=#007700]();[*]        }[*]        return [/color][color=#0000bb]$valid[/color][color=#007700];[*]    }[/list][color=black]3.案例演示[/color]
View里有Form,并且config里开启了令牌的话,在生成缓存文件的时候,会自动加一个隐藏域,代码如下:
[list=1][*][color=#007700]<?[/color][color=#0000bb]php [/color][color=#007700]if([/color][color=#0000bb]C[/color][color=#007700]([/color][color=#dd0000]"TOKEN_ON"[/color][color=#007700])):[/color][color=#0000bb]?>[*][/color][color=#000000]<input type="hidden" name="[/color][color=#0000bb]<?php [/color][color=#007700]echo [/color][color=#0000bb]C[/color][color=#007700]([/color][color=#dd0000]"TOKEN_NAME"[/color][color=#007700]);[/color][color=#0000bb]?>[/color][color=#000000]" value="[/color][color=#0000bb]<?php [/color][color=#007700]echo [/color][color=#0000bb]Session[/color][color=#007700]::[/color][color=#0000bb]get[/color][color=#007700]([/color][color=#0000bb]C[/color][color=#007700]([/color][color=#dd0000]"TOKEN_NAME"[/color][color=#007700])); [/color][color=#0000bb]?>[/color][color=#000000]"/>
[/color][*][color=#0000bb]<?php [/color][color=#007700]endif;[/color][color=#0000bb]?>[/color][/list][color=#0000bb][color=black]这时候在XxxAction.clas.php文件内,在display含有表单的页面之前,调用一下saveToken()方法,并且在接受页面调用isValidToken()方法,就OK了,下面是我的IndexAction.class.php测试代码。[/color][/color]
[color=#0000bb][list=1][*][color=#007700]<?[/color][color=#0000bb]php[*][/color][color=#007700]class [/color][color=#0000bb]IndexAction [/color][color=#007700]extends [/color][color=#0000bb]Action[/color][color=#007700]{[*]     public function [/color][color=#0000bb]index[/color][color=#007700](){[*]         [/color][color=#0000bb]$this[/color][color=#007700]->[/color][color=#0000bb]saveToken[/color][color=#007700]();[*]         [/color][color=#0000bb]$this[/color][color=#007700]->[/color][color=#0000bb]display[/color][color=#007700]();[*]    }[*][*]    public function [/color][color=#0000bb]checktoken[/color][color=#007700](){[*]       if([/color][color=#0000bb]$this[/color][color=#007700]->[/color][color=#0000bb]isValidToken[/color][color=#007700]()){[*]          echo [/color][color=#dd0000]'提交成功!'[/color][color=#007700];[*]     }[*]     else{[*]          echo [/color][color=#dd0000]'不能重复提交啦!'[/color][color=#007700];[*]       }[*]    }[*]}[*][/color][color=#0000bb]?>[/color][/color][/list][/color]

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.