डेटा सैनिटाइजेशन: कोड उदाहरण के साथ सर्वश्रेष्ठ अभ्यास


15

मैं वर्डप्रेस के लिए सुरक्षित थीम लिखने में मदद करने के लिए डेटा सैनिटाइजेशन (डेटा सत्यापन नहीं) को समझने की कोशिश कर रहा हूं। मैंने इंटरनेट पर खोज की है कि थीम डेवलपर्स को सर्वोत्तम प्रथाओं का विवरण देने के लिए एक समझने योग्य मार्गदर्शिका खोजने की कोशिश की जाए। डेटा वैलिडेशन शीर्षक कोडेक्स पेज सहित मेरे पास कुछ संसाधन थे, हालांकि मेरे लिए कोई भी उपयोगी नहीं था। कोडेक्स पेज उपलब्ध स्वच्छता कार्यों, उनके उपयोग और वे क्या करते हैं, को सूचीबद्ध करता है, लेकिन यह समझाने में विफल रहता है कि आप एक से अधिक का उपयोग क्यों करेंगे या आप किसी विशेष स्वच्छता समारोह का उपयोग किस स्थिति में करेंगे। इस पोस्ट का उद्देश्य सभी को खराब / असमान कोड के उदाहरणों का योगदान करने के लिए अनुरोध करना है और यह उचित स्वच्छता के लिए फिर से कैसे लिखा जाना चाहिए। यह सामान्य शीर्षक हो सकता है पोस्ट शीर्षक या पोस्ट थम्बनेल src या अधिक विस्तृत कोड को साफ करने के लिए जो संकरण को संभालता है$_POST Ajax अनुरोधों के लिए डेटा।

इसके अतिरिक्त, मैं जानना चाहूंगा कि क्या वर्डप्रेस डेटाबेस को जोड़ने / अपडेट करने के लिए कार्य करता है (जैसे नीचे दिए गए कोड ब्लॉक में उल्लिखित) स्वचालित रूप से आपके लिए स्वच्छता कार्य का ध्यान रखते हैं? यदि हाँ, तो क्या कोई अपवाद हैं जब आप इन वर्डप्रेस फ़ंक्शंस में भेजे गए डेटा को सैनिटाइज़ करने के लिए अतिरिक्त उपाय करेंगे?

add_user_meta
update_user_meta
add_post_meta
update_post_meta
//just to name a few

इसके अलावा, जब एचटीएमएल को PHP के इनलाइन HTML के विपरीत PHP में गूंज रहा हो तो क्या अलग से स्वच्छता की आवश्यकता होती है? मैं जो पूछ रहा हूं उससे अधिक स्पष्ट होने के लिए, यहां कोड है:

<?php echo '<div class="some-div ' . $another_class . '" data-id="' . $id . '" >' . $text . '</div>'; ?>

<div class="some-div <?php echo $another_class; ?>" data-id="<?php echo $id; ?>"><?php echo $text; ?></div>

उपरोक्त दोनों कथन एक ही बात को प्राप्त करते हैं। लेकिन क्या उन्हें अलग तरीके से संवारने की जरूरत है?


1
यह मदद कर सकता है अगर हम जानते थे कि आप क्या करने की कोशिश कर रहे थे। थीम्स डेटा प्रस्तुत करने के लिए हैं ... आपको केवल उस डेटा को सैनिटाइज़ करना होगा जो उपयोगकर्ता आपके पास सबमिट कर रहा है, और सबमिशन को आमतौर पर प्लगइन्स द्वारा नियंत्रित किया जाता है।
एमान

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

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

@OneTrickPony यह मेरे लिए स्पष्ट हो रहा है। बस यह सुनिश्चित करने के लिए कि मैं यह समझ रहा हूं - मैं टिप्पणी सामग्री से बच जाऊंगा, लेकिन टिप्पणी आईडी या पोस्ट आईडी से बच नहीं सकता, अगर मैं HTML में इनका उत्पादन कर रहा था। क्षमा करें, वास्तव में आप एक के बाद एक प्रश्नों के साथ बग।
जॉन

2
"आपको केवल उन आंकड़ों से बचना होगा जिन पर आपको भरोसा नहीं है" - मैं पूरी तरह से सहमत हूं। केवल एक चीज जो मैं जोड़ूंगा वह यह है कि आपको कभी भी डेटा पर भरोसा नहीं करना चाहिए;)
इयान डन

जवाबों:


12

यह कोडेक्स पृष्ठ इसे बहुत अच्छी तरह से बताता है कि मुझे लगता है।

सबसे महत्वपूर्ण और आमतौर पर इस्तेमाल किया जाने वाला कार्य है esc_attr। इस उदाहरण को लें:

<a href="<?php print $author_url; ?>" title="<?php print $author_name; ?>"> 
  <?php print $author_name; ?>
</a>

यदि $author_nameकोई ऐसा "पात्र है जिसे आप अपनी विशेषता को बंद करवाते हैं, और यदि उस चरित्र का अनुसरण किया जाता है, तो onclick="do_something();"यह खराब हो सकता है :)

ऐसा करने से print esc_attr($author_name)यह सुनिश्चित हो जाता है कि इस तरह के पात्र एन्कोडेड हैं, और ब्राउज़र ऐसी चीजें नहीं करता है जिन्हें वह करने वाला नहीं है।

एक ऐसा मामला है जहां आपको इसकी आवश्यकता नहीं है: जब आप एक संख्या की उम्मीद कर रहे हैं, तो किस मामले में आप केवल इनपुट डेटा को पूर्णांक में डाल सकते हैं, उदाहरण के लिए:

print (int)$_POST['some_number'];


आपके द्वारा सूचीबद्ध मेटा * फ़ंक्शंस डेटाबेस स्टोरेज के लिए इनपुट को सैनिटाइज़ करने के बारे में पहले से ही ध्यान रखते हैं, इसलिए आपको इसके बारे में चिंता करने की आवश्यकता नहीं है।

wpdb->prepare()जब आप DB प्रश्नों को स्वयं करते हैं तो विधि का उपयोग करने की आवश्यकता होती है। यहाँ एक उदाहरण है:

$sql = $wpdb->prepare('
    UPDATE wp_posts SET post_title = %s WHERE ID = %d', 
      $_POST['title'], $_POST['id']);

$wpdb->query($sql);

%sऔर %dकीवर्ड को अपने स्वच्छ $ _POST मानों से बदल जाएगा।

WP.org रिपॉजिटरी में कई प्लग इन में एक बहुत ही सामान्य गलती मुझे पहले से तैयार क्वेरी को पारित करने के लिए है (और बुरी तरह से तैयार), जैसे:

$wpdb->prepare('UPDATE wp_posts SET post_title = \''.$_POST['title'].' WHERE ...

यह मत करो :)

इसके अलावा, जब एचटीएमएल को PHP के इनलाइन HTML के विपरीत PHP में गूंज रहा हो तो क्या अलग से स्वच्छता की आवश्यकता होती है?

उपरोक्त दोनों कथन एक ही बात को प्राप्त करते हैं। लेकिन क्या उन्हें अलग तरीके से संवारने की जरूरत है?

नहीं।


आपके इनपुट के लिए Thx। आपकी व्याख्या मेरे लिए चीजों को अधिक स्पष्ट करती है।
जॉन

एक छोटे से स्पष्टीकरण की आवश्यकता है। अगर मैं PHP में एक var (जैसे $ var = 'string') स्ट्रिंग में पास करता हूँ और इसे HTML विशेषता के रूप में गूँजता हूँ, तो क्या मैं echo करने पर $ var को सैनिटाइज़ करता हूँ। या केवल तभी आवश्यक है जब मैंने डेटाबेस से $ var का मान खींच लिया था।
जॉन

जब यह स्क्रीन पर किसी तरह से गूंज रहा है, तो एक और
onetrickpony

इसलिए, अगर मैंने आपको सही तरीके से समझा, कि क्या मैंने स्ट्रिंग को PHP कोड के भीतर $ var में पारित किया है या डेटाबेस से डेटा खींचा है और $ var में पारित किया है, तो दोनों को आउटपुट एस्क करने की आवश्यकता है। सही बात?
जॉन

हां, यदि वह डेटा उपयोगकर्ता इनपुट में आता है, उदाहरण के लिए एक टिप्पणी के लेखक का नाम। यदि "PHP कोड के भीतर स्ट्रिंग को $ var में पास किया जाता है" तो आपका मतलब है कि आपने एक वैरिएबल को एक मान दिया है, तो जाहिर है - नहीं, आपको उस वैरिएबल को सेनिटाइज करने की जरूरत नहीं है
onetrickpony

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.