рдЕрдВрджрд░ рдЖрдУ! рд▓реЙрдЧрд┐рди рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг, "рдореБрдЭреЗ рдпрд╛рдж рд░рдЦреЗрдВ"

рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдХреЛ рдЙрдард╛рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдорд╛рдирдХ рдпрд╛рдж рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред



рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдк рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдЯреЛрдХрди рдЪреЛрд░реА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдореБрдЭреЗ рдпрд╛рдж рд░рдЦреЗрдВ рдЯреЛрдХрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рд╣рдорд▓рд╛рд╡рд░ рдХреЛ рдРрд╕рд╛ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рд╣реИ, рдЬреЛ рдЕрд╕реАрдорд┐рдд рд╕рдордп рддрдХ рд╕рд╛рдЗрдЯ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛, рдФрд░ рдкреАрдбрд╝рд┐рдд рдХреЛ рдЪреЛрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рднреА рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ ...



рдХреНрдпрд╛ рдХрд░реЗрдВ?



рдмреИрд░реА рдЬреИрд╕рдкреИрди рдиреЗ рдПрдХ рдмреЗрд╣рддрд░ рдпрд╛рдж рд░рдЦрдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рд╣реИред



рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдПрдХ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЯреЛрдХрди рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╢реНрд░реГрдВрдЦрд▓рд╛ред рдЖрдкрдХреЛ рдЗрд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрдк рдПрдХ рдирд┐рдпрдорд┐рдд рдЯреЛрдХрди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдФрд░ рдЯреЛрдХрди рдХреЗ рдмреАрдЪ рдореБрдЦреНрдп рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЯреЛрдХрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдлрд▓ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рдмрд╛рдж рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред



рдЬрд░реНрдХрдо рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб :



рднрдВрдбрд╛рд░рдг рддрд╛рд▓рд┐рдХрд╛:

CREATE TABLE test.one_time_auth( token CHAR (32), series CHAR (32), user_id INT (11) UNSIGNED NOT NULL, expire DATETIME DEFAULT NULL, PRIMARY KEY (series) ) ENGINE = INNODB
      
      





рдФрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ

 <?php $db = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', ''); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $auth = new one_time_auth($db); list($token, $series) = $auth->remember(10, null, '2010-12-31'); $user_id = $auth->remind($token, $series); list($token, $series) = $auth->remember(10, $series, '2010-12-31'); $user_id = $auth->remind($token, $series); echo $user_id; list($token, $series) = $auth->remember(10, $series, '2010-12-31'); try { $user_id = $auth->remind('wrongone', $series); } catch (ThiefAssumedException $e) { echo 'We think your cookie was stolen. Please, log in again.'; } $user_id = $auth->remind('wrongone', 'wrongone'); // do nothing class ThiefAssumedException extends Exception {} class one_time_auth { /** * @var PDO */ private $db; public function __construct(PDO $db) { $this->db = $db; } public function remember($user_id, $series = null, $expire = null) { $sql = 'INSERT INTO one_time_auth (token, series, user_id, expire) VALUES (:token, :series, :user_id, :expire)'; $stmt = $this->db->prepare($sql); while (true) { try { $stmt->execute(array( ':token' => $token = $this->generateToken(), ':series' => $series = $series == null ? $this->generateToken() : $series, 'user_id' => $user_id, 'expire' => $expire )); break; } catch (PDOException $e) {} } return array($token, $series); } public function remind($token, $series) { $sql = 'SELECT user_id, token FROM one_time_auth WHERE series = :series AND (expire IS NULL OR expire >= NOW()) LIMIT 1'; $stmt = $this->db->prepare($sql); $stmt->execute(array('series' => $series)); if ($row = $stmt->fetch()) { if ($row['token'] != $token) { $stmt = $this->db->prepare('DELETE FROM one_time_auth WHERE user_id = :user_id'); $stmt->execute(array('user_id' => $row['user_id'])); throw new ThiefAssumedException(); } $stmt = $this->db->prepare('DELETE FROM one_time_auth WHERE series = :series'); $stmt->execute(array('series' => $series)); return $row['user_id']; } } private function generateToken() { return md5(uniqid('', true)); } }
      
      







рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?



рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдЯреЛрдХрди рдФрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреБрдХреАрдЬрд╝ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреА рд╣реИ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрдирдХреА рддреБрд▓рдирд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдХрд░рддреА рд╣реИред рдпрджрд┐ рд╡реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрд┐рдЫрд▓реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдЯреЛрдХрди рдорд┐рд▓рддрд╛ рд╣реИред рдпрджрд┐ рдЯреЛрдХрди рдЕрд▓рдЧ рд╣реИ рдФрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕рдорд╛рди рд╣реИ, рддреЛ рд╣рдо рдЗрд╕ рдЦрд╛рддреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдпрд╛рдж рд░рдЦрдиреЗ рд╡рд╛рд▓реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐, рд╢рд╛рдпрдж, рдЙрд╕рдХрд╛ рдЯреЛрдХрди рдЪреЛрд░реА рд╣реЛ рдЧрдпрд╛ рдерд╛ред



рдкреАрдПрд╕: рдпрд╣ рдПрдХ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред



All Articles