मैं HTML विशेषताओं के अंदर उद्धरणों को कैसे ठीक से छोड़ सकता हूँ?


267

मेरे पास एक वेब पेज पर एक ड्रॉप डाउन है जो तब टूट रहा है जब मूल्य स्ट्रिंग में एक उद्धरण होता है।

मान है "asd, लेकिन DOM में यह हमेशा एक खाली स्ट्रिंग के रूप में दिखाई देता है।

मैंने हर तरह की कोशिश की है कि मुझे पता है कि स्ट्रिंग ठीक से बच जाए, लेकिन कोई फायदा नहीं हुआ।

<option value=""asd">test</option>
<option value="\"asd">test</option>
<option value="&quot;asd">test</option>
<option value="&#34;asd">test</option>

मैं इसे पृष्ठ पर कैसे प्रस्तुत करूं ताकि पोस्टबैक संदेश में सही मान हो?


आप पेज कैसे बना रहे हैं?
SLKs

1
यदि आप सिंगल कोट्स का उपयोग करते हैं तो क्या होगा? <विकल्प मूल्य = '' asd '> परीक्षण </ विकल्प>
दस ब्रिंक

5
मुझे इनमें से किसी भी उत्तर को इंगित नहीं करना है कि HTML विशेषताओं के उपयोग के लिए तार को ठीक से कैसे
बचाना है

4
@reconbot यह निर्भर करेगा कि HTML कैसे जेनरेट किया जा रहा है। प्रश्न उद्धरणों के बारे में था, इसलिए तकनीकी रूप से स्वीकृत उत्तर पूछे गए प्रश्न का उत्तर देता है। स्ट्रिंग्स से ठीक से बचने के तरीके के रूप में, मेरे पास सामान्य मामले के लिए लिंक लिंक नहीं है, लेकिन PHP में आप उपयोग करेंगे htmlentities
मैट ब्राउन

जवाबों:


343

&quot; सही तरीका है, आपके परीक्षणों का तीसरा:

<option value="&quot;asd">test</option>

आप इस काम को नीचे, या jsFiddle पर देख सकते हैं ।

alert($("option")[0].value);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select>
  <option value="&quot;asd">Test</option>
</select>

वैकल्पिक रूप से, आप एकल उद्धरणों के साथ विशेषता मान को हटा सकते हैं:

<option value='"asd'>test</option>

17
ओपी का चौथा विकल्प, & # 34 ;, भी उद्धरणों से बचने का एक वैध तरीका है। नामांकित संस्थाओं पर संख्यात्मक HTML संस्थाओं का उपयोग करने का एक लाभ है, उस नामित संस्थाओं में सभी वर्ण शामिल नहीं हैं, जबकि संख्यात्मक निकाय करते हैं। पूर्ण HTML4 सूची w3.org/TR/html4/sgml/entities.html पर है
ATK

38
@atk: हाँ, &quot;उसी वर्ण के लिए मैप करता है &#34;, लेकिन यहाँ संख्यात्मक विकल्प का उपयोग करने का कोई लाभ नहीं है क्योंकि &quot;एक परिभाषित नाम इकाई है। &quot;याद रखना भी आसान है।
एंडी ई

6
मैं सहमत हूँ। इस विशेष मामले में, & quot; का उपयोग करना आसान है; मेरा इरादा केवल सामान्य मामले को इंगित करना था।
ATK

4
@SIDU: इसे &amp;quot;a( &साथ में बदलें &amp;)
एंडी ई

4
^ अनंत लूप
उमर मेकी

16

यदि आप PHP का उपयोग कर रहे हैं, तो कॉल htmlentitiesया htmlspecialcharsफ़ंक्शन करने का प्रयास करें ।


2
बस उनका उपयोग करना पर्याप्त नहीं हो सकता है, कोशिश करें <option value='<?php echo htmlentities("' onmouseover='alert(123);' foo='"); ?>' />- सुनिश्चित करें कि आप इसे ENT_QUOTES के साथ उपयोग करते हैं, यह सुरक्षित है: <option value='<?php echo htmlentities("' onmouseover='alert(123);' foo='", ENT_QUOTES); ?>' /> लेकिन ENT_QUOTES के अलावा आपको ENT_SUBSTITUTE और ENT_DOTALLOWED भी जोड़ना चाहिए, व्यक्तिगत रूप से मैंने वर्षों से इस आवरण का उपयोग किया है:function hhb_tohtml(string $str):string { return htmlentities($str, ENT_QUOTES | ENT_HTML401 | ENT_SUBSTITUTE | ENT_DISALLOWED, 'UTF-8', true); }
hanshenrik

12

प्रति HTML सिंटैक्स , और यहां तक ​​कि HTML5 , निम्नलिखित सभी वैध विकल्प हैं:

<option value="&quot;asd">test</option>
<option value="&#34;asd">test</option>
<option value='"asd'>test</option>
<option value='&quot;asd'>test</option>
<option value='&#34;asd'>test</option>
<option value=&quot;asd>test</option>
<option value=&#34;asd>test</option>

ध्यान दें कि यदि आप XML सिंटैक्स का उपयोग कर रहे हैं तो उद्धरण (सिंगल या डबल) आवश्यक हैं।

यहाँ एक jsfiddle उपरोक्त सभी काम कर रहा है


7

एक अन्य विकल्प सिंगल कोट्स के साथ डबल कोट्स की जगह ले रहा है अगर आपको जो भी हो तो आप बुरा न मानें। लेकिन मैं इसका उल्लेख नहीं करता:

<option value='"asd'>test</option>

मैं इसका उल्लेख करता हूं:

<option value="'asd">test</option>

मेरे मामले में मैंने इस समाधान का उपयोग किया।


9
लेकिन यदि मूल्य में सिंगल और डबल कोट्स हैं, तो यह विफल हो जाएगा
रैप्टर

@ रैप्टर मैंने कहा यदि मान में दोहरे उद्धरण चिह्नों को शामिल किया गया है, तो उन्हें एकल उद्धरण में बदलें। यदि मूल्य में एकल उद्धरण शामिल हैं, तो यह कोई समस्या नहीं होगी।
csonuryilmaz

1

यदि आप जावास्क्रिप्ट और लॉडश का उपयोग कर रहे हैं, तो आप _.escape () का उपयोग कर सकते हैं, जो ", ', <,>, और & से बच जाता है।

यहां देखें: https://lodash.com/docs/#escape


0

आपको वास्तव में केवल अच्छे गुणों के श्वेतसूची में अविश्वासित डेटा की अनुमति देनी चाहिए जैसे: संरेखित करें, एलिंक, ऑल्ट, bgcolor, बॉर्डर, सेलपैडिंग, सेलस्पेसिंग, क्लास, कलर, कोल्स, कोल्प्सन, कोर्ड्स, डायर, फेस, हाइट, हस्पेस, आइसमैप, लैंग , मार्जिन, मार्जिन, मल्टीपल, nohref, noreshaize, noshade, nowrap, रेफरी, रीव, रीव्स, रो, रोस्पैन, स्क्रॉलिंग, शेप, स्पैन, समरी, टैबीइंडेक्स, टाइटल, usemap, वेलिग्न, वैल्यू, vlink, vspace, चौड़ाई

आप वास्तव में अविश्वसनीय डेटा को जावास्क्रिप्ट हैंडलर के साथ-साथ आईडी या नाम विशेषताओं (वे डोम में अन्य तत्वों को रोक सकते हैं) से बाहर रखना चाहते हैं।

इसके अलावा, यदि आप एसआरसी या एचआरईएफ विशेषता में अविश्वसनीय डेटा डाल रहे हैं, तो इसका वास्तव में एक अविश्वसनीय यूआरएल है, इसलिए आपको URL को मान्य करना चाहिए, सुनिश्चित करें कि इसकी जावास्क्रिप्ट नहीं: URL और फिर HTML इकाई सांकेतिक शब्दों में बदलना।

वहां पर सभी के बारे में अधिक जानकारी: https://www.owasp.org/index.php/Abridged_XSS_Prevention_Cheat_Sheet


3
मुझे पता है कि यह देर हो चुकी है, लेकिन उनमें से लगभग सभी विशेषताओं को HTML4.01 में पदावनत कर दिया गया है और 5. में हटा दिया गया है। वैसे भी अब कोई फर्क नहीं पड़ता, क्योंकि खुद को बचाने के लिए बेहतर तरीके हैं, बस इसे इंगित करना।
कोशिश

1
प्रश्न इसमें उद्धरण वर्णों के साथ डेटा के बारे में पूछ रहा है, न कि अविश्वसनीय डेटा के बारे में।
क्वेंटिन

-3

इनपुट पाठ के मान में उद्धरण से बचने का कोई तरीका नहीं है ... लेकिन आप जावास्क्रिप्ट (या jquery) का उपयोग कर सकते हैं:

<input type="input" name="myinput" id="myinput" value="" />
<script>document.getElementById("myinput").value="This input has a [\"]";</script>

1
आपका कथन "इनपुट टेक्स्ट के मूल्य में उद्धरण से बचने का कोई तरीका नहीं है" सादा गलत है। 2010 से स्वीकृत उत्तर देखें जिसे 276 वोट मिले हैं।
क्वेंटिन

Escuse me Quentin, लेकिन THAT ANSWER का कहना है कि ऐसा करने का कोई तरीका नहीं है। यह कहता है कि आप एक html कोडित दोहरे उद्धरण को सम्मिलित कर सकते हैं या आप सरल उद्धरण का उपयोग करने के लिए सीमांकन कर सकते हैं, लेकिन यह दोहरे उद्धरण के साथ परिभाषित मूल्य में दोहरा उद्धरण सम्मिलित करने का कोई तरीका नहीं है। यह किसी असंभव चीज का विकल्प प्रस्तावित कर रहा है, जो कि जैसा है वैसा ही है
मिगुएल

एक दोहरे उद्धरण के साथ सीमांकित मूल्य में एक दोहरे उद्धरण सम्मिलित करने का तरीका html एन्कोडिंग का उपयोग करना है जैसा आपने अभी कहा था।
क्वेंटिन

नमस्ते
मिगेल

2
यदि आप & quot; एक मान में और आप इसे भेजते हैं, सर्वर में आप 6 वर्णों को, से & से; आप एक डबल उद्धरण प्राप्त नहीं करते हैं। यह समान नहीं है और यह मेरे लिए काम नहीं करता है
मिगुएल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.