2009-10-22 17 views
11

मैं सभी पोस्ट को प्रभावी रूप से आसानी से आसानी से साफ करने और एक ही फ़ंक्शन के साथ चर प्राप्त करने के तरीके के साथ आने का प्रयास कर रहा हूं। यहाँ समारोह में ही है:

//clean the user's input 
function cleanInput($value, $link = '') 
{ 
    //if the variable is an array, recurse into it 
    if(is_array($value)) 
    { 
     //for each element in the array... 
     foreach($value as $key => $val) 
     { 
      //...clean the content of each variable in the array 
      $value[$key] = cleanInput($val); 
     } 

     //return clean array 
     return $value; 
    } 
    else 
    { 
     return mysql_real_escape_string(strip_tags(trim($value)), $link); 
    } 
} 

और यहाँ कोड है कि यह कहेंगे है:

//This stops SQL Injection in POST vars 
foreach ($_POST as $key => $value) 
{ 
    $_POST[$key] = cleanInput($value, $link); 
} 

//This stops SQL Injection in GET vars 
foreach ($_GET as $key => $value) 
{ 
    $_GET[$key] = cleanInput($value, $link); 
} 

मेरे लिए यह लगता है जैसे कि यह काम करना चाहिए। लेकिन किसी कारण से यह मेरे पास किसी रूप में मौजूद कुछ चेकबॉक्स से सरणी नहीं लौटाएगा। वे खाली बाहर आते रहते हैं।

मैंने उपरोक्त फ़ंक्शन के बिना अपने कोड का परीक्षण किया है और यह ठीक काम करता है, मैं बस उसमें कुछ अतिरिक्त सुरक्षा चाहता हूं।

धन्यवाद!

+1

आपको प्रत्येक संदर्भ के लिए सबकुछ स्वच्छ करने की कोशिश से बचना चाहिए। यह केवल आपके एप्लिकेशन को बाधित करता है और जब आप खोए कार्यक्षमता को फिर से बनाना चाहते हैं तो इसे सुरक्षित करना कठिन हो जाता है। यह एक वैध कारण है कि magic_quotes अक्षम क्यों किया गया था। http://php.net/manual/en/security.magicquotes.php कुछ ऐसा जो आप यहां एक अर्थ में पुनर्निर्माण कर रहे हैं। आपके द्वारा भेजे जा रहे एप्लिकेशन के लिए इनपुट को स्वच्छ करने की आवश्यकता है। यदि आप HTTP के माध्यम से ब्राउज़र में भेज रहे हैं, तो इसे HTTP, और HTML के लिए sanitize। यदि आप इसे एसक्यूएल डीबी में भेज रहे हैं, तो इसे एसक्यूएल के लिए sanitize। – bucabay

+0

क्षमा करें, मेरा मतलब है बहिष्कृत: http://php.net/manual/en/security.magicquotes.php – bucabay

+0

सहायता/सलाह के लिए धन्यवाद! ऐसा लगता है कि मुझे अपनी प्रक्रिया पर पुनर्विचार करने की जरूरत है। :-) – tscully

उत्तर

6

क्या आप कर रहे हैं पर्याप्त नहीं है करने के लिए कर सकते हैं। here देखें।

22

यदि संभव हो तो filter_input का उपयोग करें (php5 +) यह इसे बहुत साफ रखता है और जहां तक ​​मुझे पता है कि आप इसे उपयोग करने के लिए आवश्यक सभी चीज़ों को स्वच्छ और मान्य कर सकते हैं।

आप filter var array और उदाहरण के लिए FILTER_SANITIZE_STRING ध्वज का उपयोग कर सकते फिल्टर करने के लिए पूरी पोस्ट सरणी

filter_var_array($_POST, FILTER_SANITIZE_STRING) //just an example filter 

w3schools filter reference

+0

ओह यह कमाल है!मैंने इसे पहले कभी नहीं देखा है :) – Mickey

+1

यदि आपके पास php5 – robjmills

1

अनियंत्रित चेक बॉक्स सर्वर के लिए भेजा नहीं कर रहे हैं पर उपलब्ध विभिन्न फ़िल्टर विकल्प का भार कर रहे हैं ।

आप array_walk_recursive का उपयोग आप क्या चाहते हैं

6

आप उदाहरण के लिए array_map की तरह कुछ इस्तेमाल कर सकते हैं प्रत्यावर्तन और अधिक सुरुचिपूर्ण बनाने के लिए:

$_POST = array_map('mysql_real_escape_string',$_POST); 

उपयोग फिल्टर वर यदि आप कर सकते हैं, हालांकि के रूप में दृष्टिकोण की तरह, सिर्फ एक उदाहरण है, हालांकि आम तौर पर बुरा कर रहे हैं;)

1

इनपुट की सफाई के बारे में जाने का यह गलत तरीका है।

कंबल mysql में $_POST और $_GET वापस आने और आप काट, तब भी आप के बाद आप एक डेटाबेस क्वेरी कर दिया है डेटा का उपयोग करना चाहते हैं तो जा रहा है पूरी तरह से सब कुछ करने के लिए भागने को लागू करने, लेकिन आप में से बच वर्ण नहीं करना चाहते क्या आप वहां मौजूद हैं।

mysqli या PDO के साथ पैरामीटरयुक्त क्वेरी का उपयोग करें और आपको mysql_real_escape_string() का उपयोग करने की आवश्यकता नहीं होगी।

+0

है तो यह सबसे अच्छा तरीका है यदि आपके पास पहले से शुरू किए गए डेटाबेस से कोई कनेक्शन नहीं है। – alex

+0

मेरे पास फ़ंक्शन कॉल के ठीक ऊपर कनेक्शन स्थापित है, लेकिन आपको लोगों को यह देखने की आवश्यकता नहीं है कि मुझे वहां क्या मिला है। ;-) – tscully

+0

देखें: http://php.net/manual/en/security.magicquotes.php – bucabay

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