* token.php

<?php
// 放一个隐藏可变的token, 每次提交都需要和服务器校对
// 若通不过, 则为外部提交
define('SECRET', '67%$#ap28');

function m_token() {
    $str = mt_rand(1000, 9999);
    $str2 = dechex($_SERVER['REQUEST_TIME'] - $str);
    return $str.substr(md5($str.SECRET), 0, 10).$str2;
}

echo m_token();
echo '<br />';

function v_token($str, $delay = 300) {
    // $delay表示时间延迟, 在不同的程序根据业务来自行修改
    $rs = substr($str, 0, 4);
    $middle = substr($str, 0, 14);
    $rs2 = substr($str, 14, 8);
    return ($middle == $rs.substr(md5($rs.SECRET), 0, 10)) &&
                    ($_SERVER['REQUEST_TIME'] - hexdec($rs2) - $rs < $delay);
}

var_dump(v_token(m_token()));

* test:

php -S 0.0.0.0:8080

 

7079cb6777fa025c73e4da

 

<span style="color:#000000">/Volumes/Applications/code/php/security/token.php:24:boolean <span style="color:#75507b">true</span></span>