MiksIr
miksir@home:~$
Сессии нахрен не нужны для того, что предлагает флоппик
Это по сути то, что securelink делает. Но по ходу ему это не поможет - там JS форму исполняет со страницы.
PHP:
public function getClientToken($timed = true, $prefix = null, $suffix = '', $algo = 'sha256', $ip_part = 2)
{
$time = $timed ? (is_numeric($timed) ? time() + $timed : time() + $this->token_expire) : 0;
$token = $this->_getClientToken($time, $prefix, $suffix, $algo, $ip_part);
return $token;
}
protected function _getClientToken($time, $prefix, $suffix, $algo, $ip)
{
$ipaddr = explode('.', $_SERVER['REMOTE_ADDR']);
$ipaddr = $ip ? implode('.', array_slice($ipaddr, 0, $ip)) : '';
return
$this->_hash($algo,
$prefix
. $ipaddr
. (array_key_exists('HTTP_USER_AGENT', $_SERVER) ? md5($_SERVER['HTTP_USER_AGENT']) : '')
. что-угодно, например PHPSESSION кука
. ключ приложения из конфига (случайна строка)
. (int)$time
. $suffix)
. sprintf("%08s", dechex($time));
}
protected function _hash($algo, $value)
{
if (function_exists("hash_algos")) {
$algos = hash_algos();
if (in_array($algo, $algos)) {
return hash($algo, $value);
}
}
return sha1($value);
}
public function verifyClientToken($token, $prefix = null, $suffix = '', $algo = 'sha256', $ip_part = 2)
{
$time = substr($token, -8, 8);
$time = (int)hexdec($time);
$sign = $this->_getClientToken($time, $prefix, $suffix, $algo, $ip_part);
if ($token != $sign) {
$this->getLogger()->log("Tokens missmatch {$token} != {$sign}");
return false;
}
if ($time && $time < time()) {
$this->getLogger()->log("Token {$token} expired");
return false;
}
return true;
}