2011-05-02 13 views
12

मैं कोडिंग की दुनिया के लिए नया हूँ और PHP इसलिए सबसे अच्छा तरीका प्रपत्र डेटा को साफ़ करने में विकृत पृष्ठों, कोड इंजेक्शन और तरह से बचने के लिए क्या जानने के लिए करना चाहते हैं। क्या नमूना स्क्रिप्ट मैंने एक अच्छे उदाहरण के नीचे पाया है?पीएचपी स्वच्छ डाटा

कोड मूल रूप से http://codeassembly.com/How-to-sanitize-your-php-input/

/** 
* Sanitize only one variable . 
* Returns the variable sanitized according to the desired type or true/false 
* for certain data types if the variable does not correspond to the given data type. 
* 
* NOTE: True/False is returned only for telephone, pin, id_card data types 
* 
* @param mixed The variable itself 
* @param string A string containing the desired variable type 
* @return The sanitized variable or true/false 
*/ 

function sanitizeOne($var, $type) 
{  
    switch ($type) { 
    case 'int': // integer 
     $var = (int) $var; 
     break; 

    case 'str': // trim string 
     $var = trim ($var); 
     break; 

    case 'nohtml': // trim string, no HTML allowed 
     $var = htmlentities (trim ($var), ENT_QUOTES); 
     break; 

    case 'plain': // trim string, no HTML allowed, plain text 
     $var = htmlentities (trim ($var) , ENT_NOQUOTES) ; 
     break; 

    case 'upper_word': // trim string, upper case words 
     $var = ucwords (strtolower (trim ($var))); 
     break; 

    case 'ucfirst': // trim string, upper case first word 
     $var = ucfirst (strtolower (trim ($var))); 
     break; 

    case 'lower': // trim string, lower case words 
     $var = strtolower (trim ($var)); 
     break; 

    case 'urle': // trim string, url encoded 
     $var = urlencode (trim ($var)); 
     break; 

    case 'trim_urle': // trim string, url decoded 
     $var = urldecode (trim ($var)); 
     break; 

    case 'telephone': // True/False for a telephone number 
     $size = strlen ($var) ; 
     for ($x=0;$x<$size;$x++) 
     { 
      if (! ((ctype_digit($var[$x]) || ($var[$x]=='+') || ($var[$x]=='*') || ($var[$x]=='p')))) 
      { 
       return false; 
      } 
     } 
     return true; 
     break; 

    case 'pin': // True/False for a PIN 
     if ((strlen($var) != 13) || (ctype_digit($var)!=true)) 
     { 
      return false; 
     } 
     return true; 
     break; 

    case 'id_card': // True/False for an ID CARD 
     if ((ctype_alpha(substr($var , 0 , 2)) != true) || (ctype_digit(substr($var , 2 , 6)) != true) || (strlen($var) != 8)) 
     { 
      return false; 
     } 
     return true; 
     break; 

    case 'sql': // True/False if the given string is SQL injection safe 
     // insert code here, I usually use ADODB -> qstr() but depending on your needs you can use mysql_real_escape(); 
     return mysql_real_escape_string($var); 
     break; 
    }  
    return $var; 
} 
+0

यह उपयोगी दिखता है। यद्यपि 'htmlentities' को 'htmlspecialchars' के साथ प्रतिस्थापित किया जाना चाहिए और वर्णमाला पैरामीटर घोषित करना चाहिए। – mario

उत्तर

9

आपका उदाहरण स्क्रिप्ट महान नहीं है - एक स्ट्रिंग के तथाकथित sanitisation बस प्रत्येक छोर से सफेद whimspace trims। उस पर निर्भर होने से आपको बहुत परेशानी होगी।

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

वर्थ पढ़ने, संभव ड्यूप्स:

What's the best method for sanitizing user input with PHP?

Clean & Safe string in PHP

+0

धन्यवाद। यदि आप सभी संभावित परिदृश्यों के लिए परीक्षण करते हैं या कम से कम एक सबसेट कैसे करते हैं? – PeanutsMonkey

+0

@PeanutsMonkey - आपके उदाहरण में उपयोग किए गए _approach_ ठीक थे - यानी एक सार्वभौमिक स्वच्छता समारोह को कॉल करें जो केवल आपके द्वारा विशेष रूप से अनुरोध किए गए डेटा के साथ विशेष रूप से परिभाषित डेटा में स्वीकार करता है। वह हिस्सा अच्छा है। समस्या यह थी कि स्वच्छता पर्याप्त मजबूत होने की आवश्यकता थी। स्वच्छता संख्याएं आसान है ('i i = (float) $ i;') जैसी कुछ समस्या, आमतौर पर समस्या स्ट्रिंग के साथ होती है, क्योंकि ये दोनों SQL इंजेक्शन और एक्सएसएस हमलों के लिए कमजोर हैं। आपको वास्तव में यह जानने की आवश्यकता है कि ऐसा करने के लिए आपके तारों का क्या उपयोग किया जा रहा है। जैसे क्या उन्हें विदेशी पात्रों का समर्थन करना चाहिए? –

4

यह बुरा नहीं है पर तैनात।

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

+0

आप mysqli के साथ इसे प्राप्त कर सकते हैं। यदि आपका केवल कभी भी MySQL का उपयोग करने जा रहा है तो यह थोड़ा बेहतर हो सकता है। [mysqli तैयार बयान] (http: // php।नेट/मैनुअल/एन/mysqli.quickstart.prepared-statement.php) – Lightbulb1

18

कि स्क्रिप्ट कुछ अच्छा कार्य करता है, लेकिन यह प्रतिबंध लगाया पर एक अच्छा काम करने नहीं है!

  • सकारात्मक संख्या के लिए abs() (टिप्पणी है कि यह तैरता भी स्वीकार करता है)

  • preg_replace बाहर की सफाई के लिए ('/[^a-zA-Z0-9 .-]/','',$var):

    आपको क्या चाहिए (और स्वीकार करना चाहते हैं) आप उपयोग कर सकते हैं पर निर्भर करता है

    तार या preg_replace('/\D/','',$var) से कोई विशेष वर्ण सभी गैर अंकों पात्रों को दूर करने के

  • ctype_* functions उदाहरण के लिए। ctype_digit($var)

  • filter_var() और filter_input() कार्यों

  • type-cast जैसे। (int)$_GET['id']

  • परिवर्तित जैसे। $id=$_GET['id']+0;

+1

धन्यवाद। क्या विशेष पात्रों को हटाने के लिए नियमित अभिव्यक्तियों का उपयोग करना बेहतर है? HTMLspecialchars का उपयोग क्यों नहीं करें? – PeanutsMonkey

7

एक सामान्य नियम के रूप में अगर आप PHP & उपयोग कर रहे हैं MySQL आप डेटा तो जैसे MySQL में जाने को साफ़ करने में चाहते हैं:

$something = mysql_real_escape_string($_POST['your_form_data']); 

http://php.net/manual/en/function.mysql-real-escape-string.php

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