2009-06-28 8 views
38

मेरे पास एक साधारण PHP मेलर स्क्रिप्ट है जो POST के माध्यम से सबमिट किए गए फॉर्म से मान लेती है और उन्हें मेल करती है:मेलिंग से पहले PHP में उपयोगकर्ता इनपुट को कैसे स्वच्छ करें?

<?php 
$to = "[email protected]"; 

$name = $_POST['name']; 
$message = $_POST['message']; 
$email = $_POST['email']; 

$body = "Person $name submitted a message: $message"; 
$subject = "A message has been submitted"; 

$headers = 'From: ' . $email; 

mail($to, $subject, $body, $headers); 

header("Location: http://example.com/thanks"); 
?> 

मैं इनपुट को कैसे स्वच्छ कर सकता हूं?

+1

यदि आप सीधे-अप टेक्स्ट फ़ील्ड का उपयोग कर रहे हैं, तो आपके $ _POST डेटा में कोई HTML नहीं होना चाहिए। यदि आप कुछ प्रकार के समृद्ध टेक्स्ट एडिटर का उपयोग कर रहे हैं जो HTML उत्पन्न करता है, तो html_entity_decode() का उपयोग करें। विषय से नियंत्रण वर्णों को पट्टी करना सुनिश्चित करें - विषय में न्यूलाइन वर्ण आपके ईमेल शीर्षलेखों को खराब कर सकते हैं –

+16

@ फ्रैंक किसान: क्या आप सुझाव दे रहे हैं कि उन्हें भरोसा करना चाहिए कि कोई आक्रामक कोड उनके कोड तक नहीं पहुंच पाएगा क्योंकि उन्होंने "सीधे-अप" पाठ का क्षेत्र"? यह भयानक सलाह है। –

+9

हे, सीधे-अप टेक्स्ट फ़ील्ड। बस किसी ऐसे व्यक्ति पर एक एक्सएसएस परीक्षण किया जिसने ऐसा किया था। उन्हें "सीधा-अप टेक्स्ट फ़ील्ड" में दर्ज आईएमजी लिंक के माध्यम से भेजी जाने वाली मनोरंजक तस्वीर पसंद नहीं आया। –

उत्तर

44

filter_var() के साथ पोस्ट वैरिएबल को स्वच्छ करें।

Example here। जैसा:

echo filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); 
+0

मुझे इसके लिए filter_var पसंद है, दुख की बात है, सभी होस्टिंग सेटअप में अभी तक 5.2 नहीं है, लेकिन यह एक अच्छी तरह से विचार-विमर्श समारोह प्रतीत होता है। – artlung

+0

PHP 5 काफी अच्छा फिल्टर_वार है (PHP 5> = 5.2.0) –

+2

सभी होस्टिंग सेटअप में अभी तक 5.2 नहीं है, हे, यह 200 9 है। अब ऐसा लगता है कि वे अभी भी 5.4 चल रहे हैं, वे फिश हैं। – markus

10

आप एक SQL क्वेरी या यहाँ कुछ भी निर्माण नहीं कर रहे हैं, केवल प्रासंगिक मान्यता है कि मैं उन आदानों के लिए देख सकते हैं $ _POST [ "ईमेल"], और शायद अल्फानुमेरिक के लिए एक ईमेल सत्यापन है यदि आप वास्तव में संदेश में शामिल होने के दायरे को सीमित करना चाहते हैं तो अन्य क्षेत्रों पर फ़िल्टर करें।

ईमेल पते को फिल्टर करने के लिए बस filter_var का उपयोग करें:

$email = filter_var($email, FILTER_SANITIZE_EMAIL); 

प्रति फ्रैंक किसान सुझाव के रूप में, आप भी ईमेल के विषय में नई-पंक्तियों को फ़िल्टर कर सकते हैं:

$subject = str_replace(array("\r","\n"),array(" "," "),$subject); 
+2

न्यूलाइन वर्ण ईमेल विषय पंक्तियाँ कुछ हद तक समस्याग्रस्त हैं। –

+0

हाय फ्रैंक, मैंने आपके सुझाव को दर्शाने के लिए अपना जवाब संपादित कर लिया है। –

+7

exaclty के आधार पर ईमेल का निर्माण कैसे किया जाता है, हमलावर को किसी भी नए या प्रतिस्थापन ईमेल शीर्षलेख जोड़ने की अनुमति देने वाले किसी भी ईमेल-हेडर में नए अक्षरों को इंजेक्शन दिया जा सकता है। इसके अलावा, एक पूरी खाली रेखा (दो न्यूलाइन) इंजेक्शन करने के बाद हमलावर को अपनी पसंद के ईमेल बॉडी को सम्मिलित करने की अनुमति मिलती है, जो जेनरेट किए गए ईमेल को पूरी तरह ओवरराइड कर देती है। – Cheekysoft

4

दूसरों के रूप में उल्लेख किया है, filter_var बहुत अच्छा है। यदि यह उपलब्ध नहीं है, तो इसे अपने टूलकेस्ट में जोड़ें।

$headers चर विशेष रूप से खराब सुरक्षा-वार है। इसे जोड़ा जा सकता है और स्पूफ़ेड हेडर को जोड़ा जा सकता है। Email Injection नामक इस पोस्ट को यह अच्छी तरह से चर्चा करता है।

filter_var i बहुत अच्छा है, लेकिन यह सुनिश्चित करने का एक और तरीका है कि कुछ ईमेल पता है और isMail() फ़ंक्शन का उपयोग करना कुछ बुरा नहीं है। यहाँ एक है:

function isEmail($email) { 
    return preg_match('|^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]{2,})+$|i', $email); 
}; 

तो यह उपयोग करने के लिए, तुम कर सकते हो:

if (isset($_POST['email']) && isEmail($_POST['email'])) { 
    $email = $_POST['email'] ; 
} else { 
    // you could halt execution here, set $email to a default email address 
    // display an error, redirect, or some combination here, 
} 

पुस्तिका सत्यापन के संदर्भ में, लंबाई substr() का उपयोग कर सीमित strip_tags() चल रहा है और अन्यथा सीमित क्या में रखा जा सकता

+1

filter_var के बारे में बात करते हुए, इसमें ईमेल को प्रमाणित करने के लिए एक फ़िल्टर भी है, इसलिए आपका 'isEmail' फ़ंक्शन खराब और अनावश्यक है (उल्लेख नहीं है कि रेगेक्स ईमेल को सही तरीके से मान्य नहीं कर सकता है)। –

4

आपको $ हेडर में उपयोगकर्ताओं द्वारा प्रदान किए गए इनपुट से किसी भी नई लाइन को हटाने की आवश्यकता है, जो मेल() (आपके मामले में $ ईमेल) को पास हो जाती है! Email injection देखें।

PHP और $ विषय के लिए $ sanitizing का ध्यान रखना चाहिए, लेकिन वहाँ कीड़े के साथ PHP के संस्करणों (प्रभावित कर रहे हैं PHP 4 < = 4.4.6 और PHP 5 < = 5.2.1, MOPB-34-2007 देखें) कर रहे हैं।

0

आप artlung से कोड का उपयोग कर सकते 'ई-मेल को मान्य करने के रों जवाब ऊपर ..

मैं कोड के इस प्रकार का उपयोग हैडर इंजेक्शन को रोकने के लिए ..

// define some mail() header's parts and commonly used spam code to filter using preg_match 
$match = "/(from\:|to\:|bcc\:|cc\:|content\-type\:|mime\-version\:|subject\:|x\-mailer\:|reply\-to\:|\%0a|\%0b)/i"; 

// check if any field's value containing the one or more of the code above 
if (preg_match($match, $name) || preg_match($match, $message) || preg_match($match, $email)) { 

// I use ajax, so I call the string below and send it to js file to check whether the email is failed to send or not 
echo "failed"; 

// If you are not using ajax, then you can redirect it with php header function i.e: header("Location: http://example.com/anypage/"); 

// stop the script before it reach or executing the mail function 
die(); 

} 

mail() के शीर्ष लेख के ऊपर छानने बहुत सख्त है, क्योंकि कुछ उपयोगकर्ता अपने ईमेल फॉर्म को हाइजैक करने के किसी भी इरादे के बिना फ़िल्टर किए गए तारों का उपयोग कर रहे हैं, इसलिए इसे उस पृष्ठ पर रीडायरेक्ट करें जो यह बता रहा है कि किस प्रकार के तारों को फ़ॉर्म में अनुमति नहीं है या इसे आपके बारे में समझाएं फॉर्म पेज

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