2017-02-19 7 views
5

मैं एक निजी परियोजना में काम कर रहा हूं और तैयार बयानों का उपयोग करने के अलावा, मैं हर इनपुट को खतरे के रूप में उपयोग करना चाहता हूं। इसके लिए मैंने एक साधारण कार्य किया।PHP सुरक्षा (स्ट्रिप_टैग, एचटीएमएलटीटीएस)

function clean($input){ 
if (is_array($input)){ 
    foreach ($input as $key => $val){ 
     $output[$key] = clean($val); 
    } 
}else{ 
    $output = (string) $input; 
    if (get_magic_quotes_gpc()){ 
     $output = stripslashes($output); 
    } 
    $output = htmlentities($output, ENT_QUOTES, 'UTF-8'); 

} 
return $output; 
} 

क्या यह विचार है या क्या मुझे निम्नलिखित कोड का उपयोग करना चाहिए?

 $output = mysqli_real_escape_string($base, $input); 
     $output = strip_tags($output); 

क्षमा करें यह एक मूर्खतापूर्ण सवाल हो सकता है, लेकिन मैं मेरे साथ किसी भी समस्या से बचने के लिए कोड :) आपकी मदद

+0

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

+1

डीबीएमएस अपेक्षित डेटा प्रकार और एन्कोडिंग के आधार पर तैयार कथन में दिए गए पैरामीटर को स्वचालित रूप से स्वच्छ कर देगा। यदि आप मैन्युअल रूप से स्ट्रिंग से बच रहे हैं और फिर इसे एक तैयार कथन पैरामीटर के रूप में भेज रहे हैं तो आप वास्तव में इसे कम सुरक्षित बना रहे हैं। – apokryfos

+1

यदि आपके पास समय है, तो अपने डेटाबेस इंटरैक्शन को संभालने के लिए 'पीडीओ' का उपयोग करना सीखें। http://php.net/manual/en/book.pdo.php –

उत्तर

5

मैं अपने प्रयासों की सराहना के लिए धन्यवाद करना चाहते हैं। आपको, अनुकूल समुदाय के सदस्य, अपने परिचालन को कम करने पर विचार करना चाहिए।

) एक समारोह/नियमित/कक्षा/इनपुट (filter_input_array(), strip_tags(), str_ireplace(), trim(), आदि छानने के लिए विधि है ...)। आप उन फ़ंक्शंस बनाना चाहते हैं जो फ़िल्टरिंग करने के लिए लूप का उपयोग करते हैं। डबल एन्कोडिंग, एक बार-स्ट्रिप-स्पूफिंग, और अधिक जैसे ट्रिक्स strip_tags() जैसी चीजों के एकल उपयोग को हरा सकते हैं।

यहां मेरे Sanitizer कक्षा से strip_tags() रैपर विधि है। ध्यान दें कि यह पुराने मान की तुलना नए मान से कैसे करता है यह देखने के लिए कि वे बराबर हैं या नहीं। यदि वे बराबर नहीं हैं, तो यह strip_tags() का उपयोग करता रहता है। हालांकि, इस विधि को निष्पादित करने से पहले प्रारंभिक INPUT_POST/$ _POST जांच की गई है। trim() का उपयोग करके इसका एक और संस्करण वास्तव में इस से पहले निष्पादित किया जाता है।

private function removeHtml(&$value) 
{  
    if (is_scalar($value)) { 
     do { 
      $old = $value; 
      $value = strip_tags($value); 

      if ($value === $old) { 
       break; 
      } 
     } while(1); 
    } else if (is_array($value) && !empty($value)) { 
     foreach ($value as $field => &$string) { 
      do { 
       $old = $string; 
       $string = strip_tags($string); 

       if ($string === $old) { 
        break; 
       } 
      } while (1); 
     } 
    } else { 
     throw new Exception('The data being HTML sanitized is neither scalar nor in an array.'); 
    } 

    return; 
} 

) इनपुट (filter_var_array(), preg_match(), mb_strlen, आदि सत्यापित करने का एक और एक है ...)

फिर, अपने डेटा संदर्भों स्विच करने के लिए की जरूरत है जब ...

एक) डेटाबेस के लिए, तैयार बयान (PDO, अधिमानतः) का उपयोग करें।

बी) लौटने/ब्राउज़र को संचारण उपयोगकर्ता इनपुट के लिए, htmlentities() या htmlspecialchars तदनुसार साथ उत्पादन भाग जाते हैं।

जादू उद्धरण के संदर्भ में, करने के लिए सबसे अच्छी बात यह है कि php.ini में अक्षम करें।

अब, उन विभिन्न संरचनाओं के साथ जिम्मेदारी के अपने क्षेत्र हैं, आपको बस अपने हैंडलर फ़ाइल के अंदर तर्क और डेटा के प्रवाह का प्रबंधन करना है। इसमें उपयोगकर्ता को त्रुटि संदेश (जब आवश्यक हो) प्रदान करना और त्रुटियों/अपवादों को संभालना शामिल है।

htmlentities() या htmlspecialchars का उपयोग करने की आवश्यकता नहीं है यदि डेटा HTML फॉर्म से सीधे डेटाबेस में जा रहा है। डेटा से बचने का बिंदु इसे नए संदर्भ के अंदर निष्पादन योग्य निर्देशों के रूप में व्याख्या करने से रोकने के लिए है। कोई संदेह नहीं है htmlentities() या htmlspecialchars SQL क्वेरी इंजन में डेटा पास करते समय हल हो सकता है (यही कारण है कि आप इनपुट को फ़िल्टर और मान्य करते हैं, और (PDO) तैयार कथन का उपयोग करते हैं)।

हालांकि, डेटा के बाद डेटाबेस तालिकाओं औरहै से लिया गया है सीधे ब्राउज़र के लिए किस्मत में, ठीक है, अब htmlentities() या htmlspecialchars का उपयोग करें। function बनाएं जो उस परिदृश्य को संभालने के लिए for या foreach लूप का उपयोग करता है।

यहाँ मेरी Escaper वर्ग

public function superHtmlSpecialChars($html) 
{ 
    return htmlspecialchars($html, ENT_QUOTES | ENT_HTML5, 'UTF-8', false); 
} 

public function superHtmlEntities(&$html) 
{ 
    $html = htmlentities($html, ENT_QUOTES | ENT_HTML5, 'UTF-8', false); 
} 

public function htmlSpecialCharsArray(array &$html) 
{  
    foreach ($html as &$value) { 
     $value = $this->superHtmlSpecialChars($value); 
    } 

    unset($value); 
} 

public function htmlEntitiesArray(array &$html) 
{  
    foreach ($html as &$value) { 
     $this->superHtmlEntities($value); 
    } 

    unset($value); 
} 

आप अपनी खुद की व्यक्तिगत पसंद और स्थिति के लिए अपने कोड से तैयार करना होगा से एक टुकड़ा है।

ध्यान दें, यदि आप इसे ब्राउज़र को भेजने से पहले डेटा संसाधित पर योजना, पहले प्रसंस्करण करते हैं, तो अपने काम-बांका htmlentities() या htmlspecialchars पाशन समारोह के साथ भाग जाते हैं।

आप इसे कर सकते हैं! दोनों strip_tags() and htmlentities or htmlspecialchars().

1. के लिए

+0

यह एक अच्छा जवाब है। मुझे लगता है कि पहली वाक्य को अधिक दृढ़ता से शब्दों में लिखा जाना चाहिए: आपको * अपने कार्यों को रद्द करना होगा, क्योंकि वे अपने उद्देश्यों को पूरा करने के लिए * अलग-अलग स्थानों में * होना चाहिए। जादू उद्धरण के लिए, [PHP का अंतिम संस्करण उन्हें समर्थन देने के लिए] (http://php.net/manual/en/security.magicquotes.php) 5.3 था, * जो आधिकारिक सुरक्षा पैच प्राप्त करना बंद कर दिया [2.5 साल पहले ] (http://php.net/eol.php) *। – IMSoP

+1

@IMSoP धन्यवाद। मुझे याद है कि जानकारी शुरू करने और सूचना सुरक्षा का अध्ययन करना है। जानना * क्यों * आप कुछ कर रहे हैं (फ़िल्टर/सत्यापन/भागना) बहुत मायने रखता है। –

+0

कमाल का जवाब। धन्यवाद! – Tiago

0

प्रयोग परिदृश्य) यदि आप किसी भी HTML तत्वों बंद पट्टी प्रपत्र इनपुट कि XSS हमले के लिए असुरक्षित हो सकता है हो सकता है से चाहते हैं, तो डेटाबेस उदाहरण के लिए प्रविष्टि करने से पहले strip_tags() फ़ंक्शन का उपयोग करें

$data= strip_tags('<b>Hello</b>'); 

आपका आउटपुट "हैलो" होगा और यही सर्वर को पास किया जाना है।

2.) आप ब्राउज़र के लिए डेटा प्रिंट या स्क्रीन आप htmlentities() or htmlspecialchars() उपयोग कर सकते हैं करना चाहते हैं तो नीचे दिए गए एक प्रयोग परिदृश्य में जहाँ यह प्रयोग किया जा सकता है।

//DB PDO Connect.... 
$result2 = $db->prepare('select * from users where uid=:uid'); 
     $result2->execute(array(':uid' =>'1')); 

while ($row = $result2->fetch()) { 


$pic=htmlentities($row['profilepic'], ENT_QUOTES, "UTF-8"); 
} 

फिर आप प्रिंट $ पिक कहीं भी आप चाहते हैं और XSS हमले से मुक्त किया जा सकता है ....

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