Login Authentication Query
User को login कराना
Login query username और password को database से जाँचती है। गलत की जाए, तो यह app के सबसे बड़े security छेदों में से एक है। सुरक्षित तरीका दो नियमों पर टिका है: plain passwords कभी store न करें, और user input कभी सीधे SQL में न डालें।
ख़तरनाक तरीका
-- ऐसा कभी न करें SELECT * FROM users WHERE username = '$user' AND password = '$pass';
इसमें दो घातक ख़ामियाँ हैं: password plain text में तुलना होता है (तो इसे unhashed store करना होगा), और user input SQL में paste होता है, SQL injection allow करके। एक बनाया username login पूरी तरह bypass कर सकता है।
Plain passwords कभी store न करें
// जब user register करता है (PHP) $hash = password_hash($password, PASSWORD_DEFAULT); // password column में $hash store कीजिए, $password नहीं
मज़बूत one-way hash store कीजिए, असली password नहीं। password_hash bcrypt इस्तेमाल करता है, तो database leak हो भी जाए, attackers passwords नहीं पढ़ सकते।
Prepared statements इस्तेमाल करें
// PHP PDO के साथ
$stmt = $pdo->prepare('SELECT id, password FROM users WHERE username = ?');
$stmt->execute([$username]);
$user = $stmt->fetch();
Prepared statement query और value अलग भेजता है, तो username कभी SQL बदल नहीं सकता। यह SQL injection छेद पूरी तरह बंद करता है। ध्यान दीजिए हम सिर्फ़ username से fetch करते हैं — password से नहीं।
Password verify करना
if ($user && password_verify($password, $user['password'])) {
// login सफल
} else {
// invalid username या password
}
password_verify type किए password की store किए hash से तुलना करता है और मेल खाने पर true लौटाता है। Password code में जाँचा जाता है, कभी SQL में नहीं।
पूरा सुरक्षित flow
- User username और password submit करता है।
- Prepared statement से username द्वारा row fetch कीजिए।
- Row मौजूद हो, तो password को उसके hash से
password_verifyकीजिए। - मेल पर session शुरू कीजिए; वरना सामान्य "invalid login" message दिखाइए।
गलत username और गलत password को वही सामान्य error इस्तेमाल कीजिए, ताकि attackers न बता सकें कौन-सा गलत था।
आम गलतियाँ
- SQL में passwords तुलना करना। Username से fetch कीजिए, code में verify कीजिए।
- Plain passwords store करना। हमेशा password_hash से hash कीजिए।
- User input से SQL बनाना। Prepared statements इस्तेमाल कीजिए।
- कौन-सा field गलत था बताना। एक सामान्य error message इस्तेमाल कीजिए।
सारांश
- Plain passwords कभी store न कीजिए — bcrypt hash (password_hash) store कीजिए।
- User input सीधे SQL में कभी न डालिए — prepared statements इस्तेमाल कीजिए।
- User को username से fetch कीजिए, password से नहीं।
- Password को code में password_verify से verify कीजिए।
- किसी भी failed login को एक सामान्य error दिखाइए।
ध्यान: यह एक संवेदनशील security topic है; हमेशा मौजूदा best practices follow कीजिए। आगे, queries guard कीजिए safe UPDATE और DELETE में, या rows filter कीजिए SELECT और WHERE में।
