2010-11-11 5 views
5
$str = '"[email protected]"@domanin.com'; 

filter_var($str, FILTER_VALIDATE_EMAIL);//return valid email. 

उपरोक्त ईमेल सत्य लौटाता है ... पर्याप्त है कि आरएफसी 2822 का कहना है कि यह एक कानूनी ईमेल पता है।क्या FILTER_VALIDATE_EMAIL डेटाबेस में सम्मिलन के लिए एक स्ट्रिंग सुरक्षित बनाता है?

मेरा प्रश्न यह है कि यदि आप ऊपर दिए गए ईमेल को प्रमाणित करते हैं तो क्या एक ईमेल एसक्यूएल इंजेक्शन ले सकता है जो डीबी को नुकसान पहुंचा सकता है भले ही आपने इसे फ़िल्टर_वार के साथ फ़िल्टर किया हो?

+2

मैंने भविष्य की पीढ़ियों के लिए बेहतर खोजने योग्य बनाने के लिए थोड़ा सा शीर्षक बदल दिया –

+0

Thanx I 99% सुनिश्चित था कि यह एसक्यूएल के लिए सुरक्षित नहीं है। लेकिन अभी भी 1% एक बड़ा जोखिम है। – Val

उत्तर

4

मेरा प्रश्न यह है कि यदि आप ऊपर दिए गए ईमेल को प्रमाणित करते हैं तो क्या एक ईमेल एसक्यूएल इंजेक्शन ले सकता है जो डीबी को नुकसान पहुंचा सकता है भले ही आपने इसे फ़िल्टर_वार के साथ फ़िल्टर किया हो?

filter_varmysql_real_escape_string() तरह डेटाबेस विशिष्ट स्वच्छता के लिए एक स्थानापन्न नहीं है! किसी को भी हमेशा इसे लागू करने की जरूरत है।

+0

क्या एक्सएसएस या एसक्यूएल इंजेक्शन के उदाहरण हैं जो उस फ़िल्टर के तहत एक वैध ईमेल पते के रूप में मान्य होंगे? (अकादमिक जिज्ञासा से पूछना; स्पष्ट रूप से कोई कारण नहीं है कि 'mysql_real_escape_string() 'या इसी तरह के भागने वाले फ़ंक्शन का उपयोग न करें।)। – Yahel

+0

"1=1"@domain.com एक हो सकता है। लेकिन बहुत यकीन नहीं है। – Val

+1

@yc अच्छा सवाल! मैं अपने सिर के ऊपर से एक के बारे में नहीं सोच सकता, लेकिन खतरे बहुत अच्छा है कि कुछ चालाक संयोजन का उपयोग करना संभव है। –

2

हां - एसक्यूएल इंजेक्शन से सुरक्षा के लिए डेटाबेस विशिष्ट एस्केपिंग तंत्र के अलावा कुछ भी भरोसा न करें।

एसक्यूएल में इसका उपयोग करने से पहले हमेशा mysql_real_escape_string() का उपयोग करें।

1

इसके अलावा, यह वैसे भी सुरक्षित नहीं है। _VALIDATE_EMAIL एकल कोट्स ' और बैकटिक ` में बैकटिक की अनुमति देता है। (लेकिन सफाई कार्यों पर हमेशा भरोसा नहीं किया जाना चाहिए, हमेशा संदर्भ से बचें या पैरामीटरयुक्त एसक्यूएल का उपयोग करें।)

1

मैं यह जांचने के लिए FILTER_VALIDATE_EMAIL का उपयोग करता हूं कि ईमेल मान्य है या नहीं और फिर लाइन को और नीचे रखें यदि ईमेल को सहेजने की आवश्यकता है डेटाबेस मैं तब खतरनाक पात्रों को तोड़ दूंगा। MySQL और mysqli पुस्तकालय भी पानी में काफी ज्यादा मृत हैं इसलिए मैं पीडीओ का उपयोग करने का सुझाव दूंगा जो एक अधिक सुरक्षित विकल्प है।

http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers

इसके अलावा, नीचे दिए गए लिंक को सलाह देता है क्या पात्रों एक ईमेल पते में कानूनी रहे हैं, बैकटिक और एकल उद्धरण ईमेल पते में अनुमति दी जाती है, इसलिए शायद यही कारण है FILTER_VALIDATE_EMAIL उन्हें लेने नहीं करता है ... याद कर रहे हैं हम अवैध ईमेल पते की तलाश खतरनाक ईमेल पते नहीं है।

किसी भी प्रोग्रामिंग भाषा की बात होने पर आपको कुछ भी पसंद है, आपको हमेशा सूची के शीर्ष पर सुरक्षा रखना चाहिए!

http://email.about.com/cs/standards/a/email_addresses.htm

0

कभी VALIDATE उपयोग करते हैं, हो सकता है आप SANITILIZE उपयोग कर सकते हैं, लेकिन मैं वैसे भी इसकी सलाह नहीं देते।

$email = filter_var($_GET['email'], FILTER_VALIDATE_EMAIL); 
$query = mysqli_query($sql, 'SELECT * FROM table WHERE email = "'.$email.'"'); 

बुनियादी SQL इंजेक्शन " or 1 = 1 है, तो आप पहले से ही इसके बारे में सुना है:


इस कोड पर विचार करें। लेकिन हम espaces का उपयोग नहीं कर सकते हैं और हमें इस स्ट्रिंग को @something.com जैसे कुछ खत्म करने की आवश्यकता है।

तो, हम " से शुरू करते हैं और or'1'='1' जोड़ते हैं यह काम करेगा (क्योंकि or1=1 विफल हो जाएगा)। अब हमें @email.com की आवश्यकता है, चलो इसे एक MySQL टिप्पणी ([email protected]) के रूप में जोड़ें।

"or'1'='1'--"@email.com 

Test it.

यह filter_var के लिए मान्य ईमेल और mysqli_query के लिए असुरक्षित है: तो, यह परिणाम है।

संबंधित मुद्दे