2009-08-30 23 views
7

मैं कुकीज़/सत्रों का उपयोग करके लॉगिन सिस्टम बनाना चाहता हूं लेकिन मुझे यकीन नहीं है कि कौन सी सुरक्षा और उनके साथ ऐसा है।लॉगिन सिस्टम (PHP) कुकीज़ और सत्र

सत्रों के साथ, यदि "लॉगिन" "हाँ" पर सेट है, तो क्या मैं उस पर भरोसा कर सकता हूं? क्या उपयोगकर्ता इसे वापस करने में सक्षम हैं? क्या मुझे बस एन्क्रिप्टेड पासवर्ड स्टोर करना चाहिए और इसे प्रत्येक पृष्ठ पर जांचना चाहिए?

कुकीज़ के साथ, क्या मुझे mysql इंजेक्शन जैसी चीजों की जांच करनी होगी?

यह शुरुआती सामान की तरह लग सकता है, लेकिन अगर कोई मेरे लिए इसे स्पष्ट कर सकता है तो यह वास्तव में मदद करेगा। उत्तरों के लिए पहले से धन्यवाद!

उत्तर

7

यदि आप सत्र चर सेट करते हैं, तो उपयोगकर्ता इसे तब तक नहीं बदल सकता जब तक कि वे किसी अन्य सत्र कुकी को हाइजैक नहीं करते।

साझा करने के लिए आपको मुख्य रूप से क्या देखना है, आपका सत्र डेटा सुरक्षित नहीं है (आमतौर पर अन्य साइटें इसे देख सकती हैं)।

यह भी ध्यान देने योग्य है कि कुकी डेटा सुरक्षित नहीं है। इस पर भरोसा नहीं किया जाना चाहिए जिस तरह से डेटा पर भरोसा नहीं किया जाना चाहिए (इससे कोई फर्क नहीं पड़ता कि क्लाइंट सत्यापन आपको क्या बताता है)।

पासवर्ड के साथ अपने सर्वोत्तम प्रथाओं हैं:

  1. स्टोर एक हैश के रूप, खासकर SHA1 (पहली पसंद) या MD5 (दूसरा विकल्प) में डेटाबेस में पासवर्ड;
  2. जब आप उपयोगकर्ता का पासवर्ड प्राप्त करते हैं, तो उसे एन्क्रिप्ट करें और डेटाबेस में संग्रहीत किए गए कार्यों के विरुद्ध जांचें;
  3. उपयोगकर्ता सत्र में लॉग इन उपयोगकर्ता नाम सेट करें;
  4. कुछ अवधि के बाद कुकी को समाप्त करें (यहां तक ​​कि यदि इसके दिन भी) इसे हमेशा के लिए बनाए रखने के बजाय; और
  5. जहां संभव हो एक सुरक्षित कनेक्शन (HTTPS HTTP नहीं) का उपयोग करें। एसएसएल प्रमाणपत्र सस्ते हैं।
+0

इसका मतलब यह है कि मैं उपयोगकर्ता लॉगिन और पासवर्ड प्रत्येक लोड पृष्ठ पर जांच होनी चाहिए:

यहाँ एक त्वरित उदाहरण मैं एक सीआई परियोजना मैं कुछ हफ्तों पहले पर काम किया से चुरा लिया है? और पासवर्ड डेटाबेस और एन्क्रिप्शन विधि को सुरक्षित रखने का सबसे अच्छा तरीका कैसा सुरक्षित है? –

+1

@ ग्रू न सिर्फ लॉगिन करते समय, लेकिन आपको एक समझदार अमान्यता नीति की आवश्यकता है। अलग-अलग आईपी, समय की लंबाई, निष्क्रियता की लंबाई, इत्यादि। जो भी आप रक्षा कर रहे हैं उसके लिए जो कुछ भी समझ में आता है (उदाहरण के लिए बैंकिंग वेबसाइट पर दूसरे सुरक्षा विचार हैं जहां आप वीडियो पर टिप्पणियां छोड़ते हैं)। – cletus

+3

इस उत्तर में कुछ सुंदर पुरानी चीजें। पासवर्ड के लिए SHA1 या MD5 का उपयोग न करें: http://stackoverflow.com/questions/1581610/how-can-i-store-my-users-passwords-safely –

3

अंगूठे का नियम: उपयोगकर्ता इनपुट पर भरोसा न करें। कुकीज़ उपयोगकर्ता इनपुट हैं, कुकीज में संग्रहीत सत्र आईडी उपयोगकर्ता इनपुट हैं, http शीर्षलेख उपयोगकर्ता इनपुट हैं - इन चीजों को हर संभव चीज़ के लिए तीन बार चेक किया जाना चाहिए। दूसरी तरफ, सत्र डेटा आपके सर्वर पर संग्रहीत होता है, इसलिए यदि यह/tmp में संग्रहीत नहीं होता है तो यह कम या ज्यादा सुरक्षित होता है।

सत्र प्राधिकरण के लिए सबसे लोकप्रिय सेटअप में से एक यह है: सत्र आईडी कुकी में संग्रहीत है, और पासवर्ड सहित बाकी सब कुछ सत्र में संग्रहीत किया जाता है। कुकी से आईडी के आधार पर सत्र शुरू करने के बाद, आपको सत्र डेटा से उपयोगकर्ता आईडी प्राप्त करनी चाहिए और फिर जांचें कि वहां संग्रहीत पासवर्ड अभी भी मान्य है या नहीं।

0

कोई और सभी उपयोगकर्ता इनपुट छानबीन और धार्मिक स्वच्छ होने की जरूरत है, इसे पाने और पोस्ट डेटा, कुकी डेटा ..

आपके प्रश्न का उत्तर देने के लिए जो एक सत्र वर में लॉगिन राज्य भंडारण सुरक्षित, जवाब है हो हां है। बस उपयोगकर्ता द्वारा आपको जो कुछ भी भेजता है उसे स्वच्छ करने के लिए याद रखें, इससे कोई फर्क नहीं पड़ता कि यह कितना सुरक्षित है।

5

जैसा कि यहां कई लोगों ने कहा है, उपयोगकर्ता इनपुट पर भरोसा न करें। अपने इनपुट को स्वच्छ करके, विशेष रूप से उपयोगकर्ता नाम & पासवर्ड फ़ील्ड जो आप SQL इंजेक्शन हमलों को रोकने में मदद करते हैं।

सभी अच्छे के लिए & पवित्र कुकीज में उपयोगकर्ता नाम या पासवर्ड संग्रहीत नहीं करते हैं, उन्हें प्रत्येक अनुरोध पर सर्वर पर & भेज दिया जाता है और स्ट्रीम देखने वाले किसी भी व्यक्ति को उस डेटा को छीन सकता है ... तो आप बड़ी मुसीबत में।

यहां कुछ लेख हैं जो आपको सत्र, सुरक्षा और हैशिंग पर पढ़ना चाहिए - केवल SHA1 या MD5 के लिए अपने पासवर्ड को हैश करना पर्याप्त नहीं है, उन्हें नमक दें ताकि वे और भी मजबूत हों। अभेद्य सुरक्षा जैसी कोई चीज नहीं है - भले ही आप सबकुछ सही करते हैं, कोई भी इसे तोड़ सकता है - यह अपरिहार्य है। आपका काम चीजों को जितना संभव हो तो टूटना/शोषण करना मुश्किल है।

आपकी साइट में तोड़ने में जितना अधिक काम शामिल है, उतना ही मूल्यवान आपकी सामग्री को प्रयास के लायक होना चाहिए। आपका काम दुर्भावनापूर्ण उपयोगकर्ताओं को हतोत्साहित करना है। Password Hashing

यह कर रहा है - & नमक मिलाना तकनीक hashing PHP Security Guide: Sessions

बुनियादी पासवर्ड के साथ यह लेख सौदों -

यह लेख आपके दर्शकों के लिए अद्वितीय उंगलियों के निशान बनाने पर कुछ अच्छा जानकारी है, सत्र अपहरण और कठिन बना देता में मदद करता है कोई मतलब नहीं है सभी & सब कुछ हो - आप एक करियर कर सकते हैं सुरक्षा और पसंद करते हैं, लेकिन वे एक अच्छा प्रारंभिक बिंदु हैं। यहां कोई भी शायद बेहतर/अधिक उन्नत लेखों को इंगित कर सकता है, लेकिन मुझे व्यक्तिगत रूप से यह कोड मिलाकर मेरे कोड को मिलाकर उपयोगी पाया गया है।

2

उपयोग करने के लिए एक अच्छा अभ्यास 3 चर संग्रहित है। एक अगर वे लॉग इन हैं, तो उनके उपयोगकर्ता नाम के लिए और एक यादृच्छिक रूप से जेनरेट किया गया हैश (जो तब होता है जब वे लॉगिन करते हैं और अन्य उपयोगकर्ता जानकारी के साथ डेटाबेस में संग्रहीत होते हैं)। इस तरह, यदि वे अपना उपयोगकर्ता नाम बदलते हैं जो उनकी कुकीज़ में संग्रहीत किया जा सकता है, तो उस उपयोगकर्ता के लिए जेनरेट किए जाने वाले उस मैच से मेल नहीं खाया जाएगा।

उदाहरण: कुकी डेटा हो सकता है: log_in = true; उपयोगकर्ता = 'व्यवस्थापक'; sessionid = [यादृच्छिक रूप से जेनरेट की गई आईडी (मैं आमतौर पर केवल एमडी 5 को यादृच्छिक रूप से जेनरेट किया गया शब्द बनाता हूं)]

हर बार जब वे लॉगिन करते हैं, तो एक नया सत्रिक उत्पन्न होता है और डेटाबेस में अपने क्षेत्र में संग्रहीत होता है। अब अगर मैं अपनी कुकी जानकारी बदलना चाहता हूं और उपयोगकर्ता चर को 'उपयोगकर्ता' कहने के लिए बदलता हूं (जो एक और उपयोगकर्ता होगा तो वे हाय-जैक की कोशिश कर रहे हैं)। सत्रिक अब दूसरे उपयोगकर्ता के लिए एक के साथ मेल नहीं खाएगा और लॉगिन अस्वीकार कर दिया जाएगा।

function logged(){ 
$logged_in = $this->session->userdata('logged_in'); 
if($logged_in){ 
    $userid = $this->session->userdata('userid'); 
    $sessionhash = $this->session->userdata('hash'); 

    $this->db->where('id', $userid); 
    $this->db->where('hash', $sessionhash); 
    $query = $this->db->get('members'); 

    if($query->num_rows == 1){ 
    return TRUE; 
    }else{ 
    return FALSE; 
    } 
} 
} 
संबंधित मुद्दे