PHP

2012-08-14 35 views
8

में मेल इंजेक्शन की उचित रोकथाम क्या आप मुझे सलाह दे सकते हैं कि मैं email injection को PHP mail() में मूल संदेश डेटा खोए बिना कैसे रोकूं? जैसे अगर मुझे \r\n, To, CC इत्यादि का उपयोग करने की अनुमति देने की आवश्यकता है, तो मैं उन्हें संदेश से पूरी तरह से अलग नहीं करना चाहता हूं - मैं अभी भी उन्हें डिलीवर करना चाहता हूं, लेकिन बिना अतिरिक्त हेडर जोड़ने या मेल इंजेक्शन होने की इजाजत देने के बिना।PHP

इंटरनेट पर अधिकांश सलाहएं उस डेटा को पूरी तरह से अलग करने का सुझाव देती हैं - लेकिन मैं ऐसा नहीं करना चाहता हूं।

मैं PHP mail() फ़ंक्शन के माध्यम से सादा पाठ (गैर HTML) संदेश भेज रहा हूं।

आप क्या सलाह देंगे?

+0

'करने के लिए:' और 'प्रतिलिपि:' हेडर कर रहे हैं - आप उन्हें हटाने के द्वारा कार्यक्षमता बनाए रख सकते हैं। मुझे यकीन नहीं है कि आप यहां क्या पूछ रहे हैं। अपने प्रारंभिक विचार का एक नमूना प्रदान करें और हम आपको सही दिशा में चलाने की कोशिश करेंगे :-)। – Matt

+0

आप उपयोगकर्ता द्वारा आपूर्ति किए गए डेटा का उपयोग कहां कर रहे हैं? बस संदेश निकाय में? – FtDRbwLXw6

+0

@drrcknlsn उपयोगकर्ता द्वारा प्रदत्त डेटा संदेश निकाय और प्राप्तकर्ता ई-मेल में है। – Atm

उत्तर

7

प्राप्तकर्ता ईमेल क्षेत्र में उपयोग के लिए मान्य ईमेल को फ़िल्टर करने के लिए, filter_var() पर एक नज़र डालें:

$email = filter_var($_POST['recipient_email'], FILTER_VALIDATE_EMAIL); 

if ($email === FALSE) { 
    echo 'Invalid email'; 
    exit(1); 
} 

यह सुनिश्चित करें कि आपके उपयोगकर्ताओं को केवल विलक्षण, मान्य ईमेल को, जिसे फिर आप mail() को पारित कर सकते हैं आपूर्ति कर देगा समारोह। जहां तक ​​मुझे पता है, PHP mail() फ़ंक्शन का उपयोग करके संदेश निकाय के माध्यम से हेडर को इंजेक्ट करने का कोई तरीका नहीं है, ताकि डेटा को किसी विशेष प्रसंस्करण की आवश्यकता न हो।

अद्यतन:

the documentation for mail(), जब यह एक एसएमटीपी सर्वर के लिए सीधे बात कर रहा है, तो आप संदेश के मुख्य भाग में पूर्ण विराम को रोकने के लिए की आवश्यकता होगी के अनुसार:

$body = str_replace("\n.", "\n..", $body); 

# 2 अद्यतन:

जाहिर है, इस विषय के माध्यम से इंजेक्ट करना भी संभव है, लेकिन चूंकि FILTER_VALIDATE_EMAIL_SUBJECT नहीं है, तो आपको करना होगा अपने आप को छानने:

$subject = str_ireplace(array("\r", "\n", '%0A', '%0D'), '', $_POST['subject']); 
+0

धन्यवाद, लेकिन इंटरनेट पर यह कहता है कि मेल() फ़ंक्शन का उपयोग करके संदेश निकाय में हेडर को इंजेक्ट करना संभव है। – Atm

+0

हालांकि, filter_var फ़ंक्शन के लिए धन्यवाद। मैं नियमित अभिव्यक्ति के बजाय इसका उपयोग करने जा रहा हूं जिसका उपयोग मैं कर रहा हूं। – Atm

+2

@Atern नोट filter_var की कुछ सीमाएं हैं जिन पर यह ईमेल देता है, यही कारण है कि मैं अभी भी ईमेल सत्यापन के लिए रेगेक्स का उपयोग करता हूं, मैं इसका उपयोग करता हूं: http://www.dominicsayers.com/isemail – Sammaye

3

आप मान लीजिए आप तो जैसे वैकल्पिक हैडर क्षेत्र में आगंतुक के ईमेल पते को रखना चाहता हूँ:

$headers = "From: $visitorEmailAddress"; 

हालांकि, अगर

$ visitorEmailAddress

में

शामिल हैं

"[email protected] \ n \ एनबीसीसी: [email protected]"

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

यदि FROM और/या TO फ़ील्ड के लिए आपका फॉर्म सत्यापन ठीक है, तो आपको ईमेल के निकाय के लिए फॉर्म सत्यापन देखना होगा।मैं '- =' और '= -' वर्णों को बाहर निकाल दूंगा, और strip_tags() का उपयोग कर उपयोगकर्ताओं को सादा HTML टाइप करने से रोक दूंगा।

0

एक नामित माइम ईमेल लाइब्रेरी का, Mail_Mime की तरह:

<?php 
include 'Mail.php'; 
include 'Mail/mime.php' ; 

$mime = new Mail_mime(); 

$mime->setTXTBody("Message goes here"); 
$hdrs = $mime->headers(array(
    'From' => '[email protected]', 
    'Subject' => 'Test mime message' 
)); 
$body = $mime->get(); 

$mail = &Mail::factory('mail'); 
$mail->send('[email protected]', $hdrs, $body); 

?>