per-session token
का उपयोग करने के बजाय मैं अतिरिक्त सुरक्षा के लिए per-form/url token
पसंद करूंगा, कुछ लोग तर्क दे सकते हैं कि per-request token
सबसे सुरक्षित है लेकिन उपयोगिता को प्रभावित करता है।
मुझे लगता है कि आपके सत्र स्टोरेज को अपने टोकन स्टोरेज से अलग करना बेहतर है और Memcache
जैसे कुछ का उपयोग करना बेहतर है। जब आप गति की जरूरत है कई आवेदन सर्वर आदि एक विशिष्ट उदाहरण
एचटीएमएल
का उपयोग कर मैं भी इसे पसंद करते क्योंकि मैं पूरे
session
यहाँ को प्रभावित किए बिना एक कस्टम expiration to the token
जोड़ सकते हैं है, तो यह बेहतर है
<form method="POST" action="#">
IP:<input type="text" name="IP" /> <input type="hidden" name="token"
value="<?php echo Token::_instance()->generate(); ?>" /> <input
type="Submit" value="Login" />
</form>
प्रसंस्करण
$id = "id44499900";
Token::_instance()->initialise($id); // initialise with session ID , user ID or IP
try {
Token::_instance()->authenticate();
// Process your form
} catch (TokenException $e) {
http_response_code(401); // send HTTP Error 401 Unauthorized
die(sprintf("<h1>%s</h1><i>Thief Thief Thief</i>", $e->getMessage()));
}
कक्षा में प्रयुक्त
class Token {
private $db;
private $id;
private static $_instance;
function __construct() {
$this->db = new Memcache();
$this->db->connect("localhost");
}
public static function _instance() {
self::$_instance === null and self::$_instance = new Token();
return self::$_instance;
}
public function initialise($id) {
$this->id = $id;
}
public function authenticate(array $source = null, $key = "token") {
$source = $source !== null ? $source : $_POST;
if (empty($this->id)) {
throw new TokenException("Token not Initialised");
}
if (! empty($source)) {
if (! isset($source[$key]))
throw new TokenException("Missing Token");
if (! $this->get($this->id . $source[$key])) {
throw new TokenException("Invalid Token");
}
}
}
public function get($key) {
return $this->db->get($key);
}
public function remove($key) {
return $this->db->delete($key);
}
public function generate($time = 120) {
$key = hash("sha512", mt_rand(0, mt_getrandmax()));
$this->db->set($this->id . $key, 1, 0, $time);
return $key;
}
}
class TokenException extends InvalidArgumentException {
}
नोट: ध्यान दें कि उदाहरण प्रभावित कर सकता है "वापस" बटन या ताज़ा क्योंकि टोकन स्वचालित रूप से 120
सेकंड के बाद हटा दिया जाएगा और इस
संभावित डुप्लिकेट: [सीएसआरएफ सुरक्षा: क्या हमें हर रूप के लिए टोकन उत्पन्न करना है?] (Http://stackoverflow.com/q/8655817/53114) – Gumbo
वह कोड स्वयं पर्याप्त नहीं है।उस टोकन को (समूह) के रूप में एक अद्वितीय पहचानकर्ता के साथ नमक के रूप में उपयोग किया जाता है, लीक पर नुकसान कम करता है और उपयोगकर्ताओं के लिए उपयोगिता भी रखता है। आपको समाप्ति के संबंध में मुद्दों को कम करने की भी आवश्यकता है। यदि आपके टोकन हमेशा उपयोग योग्य हैं। सीएसआरएफ के संबंध में यह एक डिजाइन दोष है। – Khez