मैं कोडइग्निटर 3.1.11 में एक ई-कॉमर्स साइट विकसित कर रहा हूं और सक्रिय रिकॉर्ड स्वचालित रूप से एकल उद्धरण से नहीं बचते हैं। लेकिन दस्तावेज़ीकरण में यह उल्लेख किया गया है कि सक्रिय रिकॉर्ड स्वचालित रूप से इनपुट से बच जाएंगे।

$ar = array(
   'name'=>"Jon'", //see the extra single quote here after the name Jon
);
$this->db->insert('test',$ar);

यह कोड डेटाबेस में सिंगल कोट जोड़ देगा और यदि मैं यह डेटा प्राप्त करता हूं और इसे HTML में प्रदर्शित करता हूं तो कोई भी वहां इनलाइन जेएस निष्पादित कर सकता है। Jon' onmouseover='alert(1) यह इनपुट पेज पर इनलाइन जेएस निष्पादित करेगा। <input type='text' name='username' value='Jon' onmouseover='alert(1)' यहाँ देखें onmouseover को अतिरिक्त विशेषता के रूप में जोड़ा गया है।

$ar = array(
   'name'=>$this->db->escape_str("Jon'"), //see the extra single quote here after the name Jon
);
$this->db->insert('test',$ar);

मैंने मैन्युअल रूप से escape_str फ़ंक्शन की कोशिश की है लेकिन यह सिंगल कोट Jon\' से पहले बैकवर्ड स्लैश जोड़ रहा है, इसलिए इनलाइन जेएस निष्पादित नहीं होगा लेकिन यह एक ईकॉमर्स साइट हो सकती है यह संभव हो सकता है कि वास्तविक एकल हो उद्धरण भी हैं उदा। पुरुषों के कपड़े, महिलाओं के कपड़े लेकिन अगर मैं escape_str का उपयोग करता हूं तो यह Mens\'s Clothes ,Women\'s Clothes के रूप में प्रदर्शित होगा इस स्थिति में क्या करना है? कोई सुझाव?

1
Sagar Gor 31 पद 2020, 08:16

1 उत्तर

सबसे बढ़िया उत्तर

मैन्युअल रूप से बचने के लिए CI के फ़ंक्शन escape_str() का उपयोग करें स्ट्रिंग्स और डेटा वापस प्राप्त करते समय php फ़ंक्शन html_entity_decode()< /ए>:

echo html_entity_decode('joe\', Mens\'s Clothes, Women\'s Clothes');

कौन सा आउटपुट

joe', Mens's Clothes, Women's Clothes

या बेहतर ढंग से अपने इनपुट फ़ील्ड को इसमें बदलें:

<input type="text" name="username" value="" onmouseover="alert(1)">

फिर सीआई डालने() से स्वचालित रूप से बचने से आपको मूल्य परिणामों में joe' डालने के रूप में सेवा मिलेगी

<input type="text" name="username" value="joe'" onmouseover="alert(1)">

संपादित करें: इसलिए आपने टिप्पणी की कि बदलने के लिए कई फाइलें हैं, आप इस दृष्टिकोण का उपयोग htmlentities():

यह php फ़ंक्शन एक एकल उद्धरण को &#039; में बदल देता है और इसलिए आपके कोड में अन्य एकल उद्धरणों में हस्तक्षेप नहीं करता है। ब्राउज़र द्वारा आउटपुट ' है

$ar = array(
   'name'=>htmlentities("Jon'", ENT_QUOTES)
);
$this->db->insert('test',$ar);

ध्वज के उपयोग पर ध्यान दें ENT_QUOTES: जो दोहरे और एकल उद्धरण दोनों को रूपांतरित करेगा।

अब आपके एचटीएमएल में डेटाबेस से मूल्य प्राप्त करते समय आपको यह कोड मिल जाएगा:

<input type='text' name='username' value='Jon&#039;' onmouseover='alert(1)'>

जो अब आपके अन्य एकल उद्धरणों में हस्तक्षेप नहीं कर रहा है (बस कोड स्निपेट चलाएँ)

1
Vickel 1 जिंदा 2021, 18:08
आपके उत्तर के लिए धन्यवाद। लेकिन मैं इस समस्या का सामना कई अलग-अलग पृष्ठों में कर रहा हूं। इसलिए प्रत्येक पृष्ठ पर इसे बदलने में समय लगेगा। क्या कोडइग्निटर सक्रिय रिकॉर्ड में कोई फ़ंक्शन है जो डेटा लाने या डालने के दौरान ऑटो इनपुट या आउटपुट से बच जाता है?
 – 
Sagar Gor
1 जिंदा 2021, 07:22
मैंने अपना जवाब अपडेट कर लिया है, जो अब आपको उपयुक्त होना चाहिए ...
 – 
Vickel
1 जिंदा 2021, 18:03
ठीक है, मुझे लगता है कि यही वह चीज है जो मुझे चाहिए। आपके बहुमूल्य समय और उत्तर के लिए धन्यवाद।
 – 
Sagar Gor
2 जिंदा 2021, 08:58
लेकिन मैं एक बात में थोड़ा भ्रमित हूं अगर आप इसमें मेरी मदद कर सकते हैं तो यह भी मेरे लिए मददगार होगा। क्यों कोडइग्निटर 3.1.11 यहां प्रलेखन में उल्लेख किए जाने के बाद भी उद्धरणों से स्वतः नहीं बच रहा है। डेटा डालना
 – 
Sagar Gor
2 जिंदा 2021, 09:03
1
ऑटोस्केप के साथ, आपको डेटाबेस से joe' वापस मिल जाएगा, जो आपके मार्कअप को खराब कर देगा (क्योंकि आपकी टिप्पणी के अनुसार आप सिंगल कोट्स को डबलकोट्स में बदलने में सक्षम नहीं हैं)। इसलिए htmlentities() के साथ समाधान।
 – 
Vickel
2 जिंदा 2021, 17:36