आपकी resetkey
के आगे कॉलम में एक DATETIME
रखें कॉलम कहा जाता है, हो सकता है, expires
।
फिर, जब भी आप कोई नई रीसेट कुंजी डालें, तो समय सीमा समाप्त होने पर भी एक मान डालें:
INSERT INTO forgot (resetkey, expires) VALUES (whatever, NOW() + INTERVAL 48 HOUR)
तालिका से कोई भी रीसेट कुंजी पढ़ने से ठीक पहले, यह करें:
DELETE FROM forgot WHERE expires < NOW()
तब आप कभी भी समय सीमा समाप्त कुंजी नहीं देखेंगे; यदि उनकी समय सीमा समाप्त हो गई है तो वे हमेशा मिटा दिए जाएंगे।
अब, आप उपयोगकर्ता द्वारा सुसज्जित रीसेट कुंजी की तलाश के साथ कुछ करना चुन सकते हैं। यदि यह समाप्त हो गया है तो आप उपयोगकर्ता को इसकी घोषणा कर सकते हैं:"आपकी रीसेट कुंजी समाप्त हो गई है।" लेकिन यह एक बुरा विचार है ... सुरक्षा के लिए आपको उपयोगकर्ताओं को यह समझने में मदद नहीं करनी चाहिए कि रीसेट कुंजी जैसा सुरक्षा टोकन अमान्य क्यों है। आपको बस इतना कहना चाहिए "कि रीसेट कुंजी सही नहीं है।"
क्या यह इस संभावना को खुला छोड़ देता है कि समाप्त हो चुके टोकन वाली कुछ पंक्तियाँ तालिका में बनी रहेंगी? हां। लेकिन आपके ऐप के लिए वास्तव में उन्हें पढ़ना और उनका उपयोग करना संभव नहीं होगा यदि आप किसी भी टोकन का उपयोग करने से पहले समाप्त हो चुके लोगों को मिटा देने की प्रक्रिया का पालन करते हैं। यदि आपके पास समाप्त हो चुके टोकन को तालिका में रखने से बचने का कोई कारण था, भले ही वे बेकार हों, तो आप DELETE
चलाने के लिए एक ईवेंट या किसी अन्य प्रकार की नियमित रूप से शेड्यूल की गई नौकरी सेट कर सकते हैं। मैंने जिस कथन का उल्लेख किया है।