सुरक्षा कोड के लिए, कृपया इस तरह से अपने टोकन उत्पन्न न करें: $token = md5(uniqid(rand(), TRUE));
इसे आज़माएं:
CSRF टोकन जनरेट करना
PHP 7
session_start();
if (empty($_SESSION['token'])) {
$_SESSION['token'] = bin2hex(random_bytes(32));
}
$token = $_SESSION['token'];
सिडेनोट: मेरे नियोक्ता के ओपन सोर्स प्रोजेक्ट्स में से एक PHP 5 प्रोजेक्ट्स में बैकपोर्ट random_bytes()
और एक पहल है random_int()
। यह MIT लाइसेंस प्राप्त है और परागी / random_compat के रूप में Github और संगीतकार पर उपलब्ध है ।
PHP 5.3+ (या ext-mcrypt के साथ)
session_start();
if (empty($_SESSION['token'])) {
if (function_exists('mcrypt_create_iv')) {
$_SESSION['token'] = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));
} else {
$_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32));
}
}
$token = $_SESSION['token'];
CSRF टोकन का सत्यापन
सिर्फ उपयोग ==
या यहां तक कि ===
, उपयोग न करें hash_equals()
(PHP 5.6+ केवल, लेकिन हैश-कॉम्पिटिटर लाइब्रेरी के साथ पुराने संस्करणों के लिए उपलब्ध )।
if (!empty($_POST['token'])) {
if (hash_equals($_SESSION['token'], $_POST['token'])) {
// Proceed to process the form data
} else {
// Log this as a warning and keep an eye on these attempts
}
}
पेर-फॉर्म टोकन के साथ आगे जाना
आप आगे टोकन का उपयोग करके केवल एक विशेष रूप के लिए उपलब्ध होने के लिए प्रतिबंधित कर सकते हैं hash_hmac()
। HMAC एक विशेष प्रकार का हैश फ़ंक्शन है जो कमजोर हैश फ़ंक्शंस (जैसे MD5) के साथ भी उपयोग करने के लिए सुरक्षित है। हालांकि, मैं इसके बजाय हैश कार्यों के SHA-2 परिवार का उपयोग करने की सलाह देता हूं।
पहले, HMAC कुंजी के रूप में उपयोग के लिए एक दूसरा टोकन उत्पन्न करें, फिर इसे रेंडर करने के लिए इस तरह से तर्क का उपयोग करें:
<input type="hidden" name="token" value="<?php
echo hash_hmac('sha256', '/my_form.php', $_SESSION['second_token']);
?>" />
और फिर टोकन का सत्यापन करते समय एक सर्वांगसम ऑपरेशन का उपयोग करना:
$calc = hash_hmac('sha256', '/my_form.php', $_SESSION['second_token']);
if (hash_equals($calc, $_POST['token'])) {
// Continue...
}
एक रूप के लिए उत्पन्न टोकन को बिना जाने दूसरे संदर्भ में उपयोग नहीं किया जा सकता है $_SESSION['second_token']
। यह महत्वपूर्ण है कि आप एचएमएसी कुंजी के रूप में एक अलग टोकन का उपयोग करें, जो आप पृष्ठ पर छोड़ते हैं।
बोनस: हाइब्रिड दृष्टिकोण + टहनी एकीकरण
जो कोई भी Twig templating इंजन का उपयोग करता है, वह अपने Twig परिवेश में इस फ़िल्टर को जोड़कर एक सरल दोहरी रणनीति से लाभ उठा सकता है:
$twigEnv->addFunction(
new \Twig_SimpleFunction(
'form_token',
function($lock_to = null) {
if (empty($_SESSION['token'])) {
$_SESSION['token'] = bin2hex(random_bytes(32));
}
if (empty($_SESSION['token2'])) {
$_SESSION['token2'] = random_bytes(32);
}
if (empty($lock_to)) {
return $_SESSION['token'];
}
return hash_hmac('sha256', $lock_to, $_SESSION['token2']);
}
)
);
इस ट्विग फ़ंक्शन के साथ, आप सामान्य प्रयोजन के टोकन दोनों का उपयोग कर सकते हैं जैसे:
<input type="hidden" name="token" value="{{ form_token() }}" />
या नीचे बंद संस्करण:
<input type="hidden" name="token" value="{{ form_token('/my_form.php') }}" />
टहनी केवल टेम्पलेट रेंडरिंग से संबंधित है; आपको अभी भी टोकन को ठीक से सत्यापित करना होगा। मेरी राय में, अधिकतम सुरक्षा की संभावना को बनाए रखते हुए, ट्विग रणनीति अधिक लचीलापन और सरलता प्रदान करती है।
एकल-उपयोग CSRF टोकन
यदि आपके पास सुरक्षा की आवश्यकता है, तो प्रत्येक CSRF टोकन को एक बार उपयोग करने योग्य बनाने की अनुमति है, सबसे सरल रणनीति प्रत्येक सफल सत्यापन के बाद इसे पुन: उत्पन्न करती है। हालाँकि, ऐसा करना हर पिछले टोकन को अमान्य कर देगा जो उन लोगों के साथ अच्छी तरह से मेल नहीं खाता है जो एक साथ कई टैब ब्राउज़ करते हैं।
पैरागॉन इनिशिएटिव एंटरप्राइजेज इन कोने के मामलों के लिए एक एंटी-सीएसआरएफ पुस्तकालय रखता है । यह विशेष रूप से प्रति-उपयोग टोकन के साथ काम करता है। जब सत्र डेटा (डिफ़ॉल्ट कॉन्फ़िगरेशन: 65535) में पर्याप्त टोकन संग्रहीत किए जाते हैं, तो यह सबसे पुराने अनरिड्ड टोकन को पहले बाहर कर देगा।
token_time
लिए प्रयोग किया जाता है?