PHP में प्रमाणीकरण और प्राधिकरण: बुनियादी से सुरक्षा तक
आधुनिक वेब डेवलपमेंट में प्रमाणीकरण (उपयोगकर्ता की पहचान सत्यापित करना) और प्राधिकरण (पहुँच अधिकारों की जाँच करना) मूलभूत सुरक्षा तंत्र हैं। PHP में ये प्रक्रियाएँ सेशन, कुकीज़, पासवर्ड हैशिंग और टोकन के माध्यम से कार्यान्वित की जाती हैं। इस लेख में हम pythonlib.ru शैक्षिक साइट पर एक सुरक्षित लॉगिन सिस्टम बनाने के लिए सभी प्रमुख पहलुओं को समझेंगे।
1. मूल अवधारणाएँ: प्रमाणीकरण बनाम प्राधिकरण
कोड लिखने से पहले, इन दो शब्दों के बीच अंतर स्पष्ट रूप से समझना महत्वपूर्ण है:
- प्रमाणीकरण — यह सत्यापित करने की प्रक्रिया कि उपयोगकर्ता वही है जो वह होने का दावा करता है (लॉगिन + पासवर्ड, बायोमेट्रिक्स, टोकन)।
- प्राधिकरण — यह निर्धारित करना कि प्रमाणित उपयोगकर्ता के लिए कौन से संसाधन और क्रियाएँ उपलब्ध हैं (भूमिकाएँ: एडमिन, मॉडरेटर, उपयोगकर्ता)।
PHP में, प्रमाणीकरण आमतौर पर सेशन या JWT के माध्यम से किया जाता है, और प्राधिकरण डेटाबेस में भूमिकाओं की जाँच के माध्यम से किया जाता है।
2. पासवर्ड हैशिंग: पासवर्ड कभी भी सादे टेक्स्ट में न रखें
PHP पासवर्ड को सुरक्षित रूप से हैश करने के लिए अंतर्निहित फ़ंक्शन प्रदान करता है। password_hash() और password_verify() का उपयोग करें — यह आधुनिक मानक है।
// उपयोगकर्ता पंजीकरण
$password = $_POST['password'];
$hashedPassword = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
// $hashedPassword को डेटाबेस में सेव करें
$sql = "INSERT INTO users (email, password_hash) VALUES (?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$_POST['email'], $hashedPassword]);
// लॉगिन पर जाँच
$inputPassword = $_POST['password'];
$storedHash = $user['password_hash']; // डेटाबेस से
if (password_verify($inputPassword, $storedHash)) {
// प्रमाणीकरण सफल
$_SESSION['user_id'] = $user['id'];
} else {
// गलत पासवर्ड
}
3. PHP में सेशन प्रबंधन
सेशन प्रमाणित उपयोगकर्ताओं को ट्रैक करने का सबसे सामान्य तरीका है। PHP स्वचालित रूप से एक अद्वितीय सेशन आईडी उत्पन्न करता है और इसे कुकी में संग्रहीत करता है।
// सेशन शुरू करें (हमेशा स्क्रिप्ट की शुरुआत में)
session_start();
// सफल लॉगिन के बाद
$_SESSION['user_id'] = $user['id'];
$_SESSION['user_role'] = $user['role']; // प्राधिकरण के लिए
$_SESSION['logged_in'] = true;
// सुरक्षित पृष्ठों पर प्रमाणीकरण जाँच
function requireAuth() {
if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) {
header('Location: /login.php');
exit;
}
}
// सिस्टम से बाहर निकलें
session_destroy();
setcookie(session_name(), '', time() - 3600, '/');
4. सेशन सुरक्षा: हमलों से बचाव
सेशन हाईजैकिंग और सेशन फिक्सेशन हमलों को रोकने के लिए निम्नलिखित उपायों का उपयोग करें:
- लॉगिन के बाद सेशन आईडी पुनर्जीवित करें:
session_regenerate_id(true); // पुराने सेशन को हटाता है
- User-Agent और IP की जाँच करें (वैकल्पिक, लेकिन सुरक्षा बढ़ाता है):
$_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
// हर अनुरोध पर
if ($_SESSION['user_agent'] !== $_SERVER['HTTP_USER_AGENT']) {
session_destroy();
die('संदिग्ध गतिविधि');
}
- सेशन कुकी के लिए फ़्लैग सेट करें
php.iniमें याsession_set_cookie_params()के माध्यम से:
session_set_cookie_params([
'lifetime' => 0, // ब्राउज़र बंद होने तक
'secure' => true, // केवल HTTPS
'httponly' => true, // JavaScript से उपलब्ध नहीं
'samesite' => 'Strict' // CSRF से सुरक्षा
]);
session_start();
5. API और सर्वरलेस ऐप्स के लिए JWT (JSON Web Tokens)
यदि आप REST API विकसित कर रहे हैं या सर्वर-साइड सेशन से बचना चाहते हैं, तो JWT एक बेहतरीन विकल्प है। JWT एक स्व-निहित टोकन है जिसमें उपयोगकर्ता की जानकारी और एक्सपायरी समय शामिल होता है।
// JWT जनरेट करना (firebase/php-jwt लाइब्रेरी का उपयोग करके)
use Firebase\JWT\JWT;
$key = "your-secret-key";
$payload = [
'user_id' => $user['id'],
'role' => $user['role'],
'exp' => time() + 3600 // 1 घंटे में एक्सपायर
];
$jwt = JWT::encode($payload, $key, 'HS256');
// क्लाइंट को JWT भेजें
echo json_encode(['token' => $jwt]);
// JWT सत्यापित करना
$decoded = JWT::decode($jwt, $key, ['HS256']);
$userId = $decoded->user_id;
$role = $decoded->role;
6. डेटाबेस-आधारित प्राधिकरण: भूमिकाएँ और अनुमतियाँ
एक बार उपयोगकर्ता प्रमाणित हो जाने के बाद, प्राधिकरण यह नियंत्रित करता है कि वे क्या कर सकते हैं। एक सामान्य दृष्टिकोण भूमिका-आधारित पहुँच नियंत्रण (RBAC) है।
// डेटाबेस संरचना
// users तालिका: id, email, password_hash, role (admin, editor, user)
// प्राधिकरण जाँच फ़ंक्शन
function hasRole($requiredRole) {
if (!isset($_SESSION['user_role'])) {
return false;
}
return $_SESSION['user_role'] === $requiredRole;
}
// उपयोग
if (hasRole('admin')) {
// एडमिन पैनल तक पहुँच
} else {
// पहुँच अस्वीकार
}
निष्कर्ष
PHP में सुरक्षित प्रमाणीकरण और प्राधिकरण के लिए सही उपकरणों और प्रथाओं की आवश्यकता होती है। password_hash() का उपयोग करके पासवर्ड हैश करें, सेशन को सुरक्षित रूप से प्रबंधित करें, और API के लिए JWT पर विचार करें। हमेशा अपने कोड को सामान्य हमलों जैसे SQL इंजेक्शन, XSS और CSRF से सुरक्षित रखें।
अधिक PHP ट्यूटोरियल और उदाहरणों के लिए pythonlib.ru पर जाएँ!