2012-05-01 121 views
7

HTML विशेषता संदर्भ के लिए अविश्वसनीय डेटा को एन्कोड करने का उचित तरीका क्या है? उदाहरण के लिए:PHP: HTML विशेषता एन्कोडिंग/जावास्क्रिप्ट डिकोडिंग

<input type="hidden" value="<?php echo $data; ?>" /> 

मैं आमतौर पर htmlentities() या htmlspecialchars() यह करने के लिए उपयोग करें:

<input type="hidden" value="<?php echo htmlentities($data); ?>" /> 

हालांकि, मैं हाल ही में एक मुद्दा यह है जहाँ मेरे आवेदन को तोड़ने जब डेटा मैं पारित करने के लिए की जरूरत है एक था में भाग यूआरएल जो जरूरत जावास्क्रिप्ट को हस्तांतरित कर दिया करने के लिए पेज स्थान बदलने के लिए:

<input id="foo" type="hidden" value="foo?bar=1&amp;baz=2" /> 
<script> 
    // ... 
    window.location = document.getElementById('foo').value; 
    // ... 
</script> 

इस मामले में, foo एक सी कार्यक्रम है, और यह यूआरएल और segfaults में एन्कोडेड वर्णों को समझ में नहीं आता है।

मैं आसानी से जावास्क्रिप्ट में मान ले सकता हूं और value.replace('&amp;', '&') जैसा कुछ कर सकता हूं, लेकिन यह लगता है कि यह kludgy है, और केवल ampersands के लिए काम करता है।

तो, मेरा सवाल यह है: क्या एचटीएमएल विशेषताओं में इंजेक्शन वाले डेटा के एन्कोडिंग या डिकोडिंग के बारे में जाने का कोई बेहतर तरीका है?

मैं OWASP's XSS Prevention Cheatsheet पढ़ लिया है, और यह रूप में लंबे समय के रूप में मैं अपने गुण उद्धृत करने के लिए सावधान कर रहा हूँ की तरह मेरे लिए लगता है, उसके बाद ही चरित्र मैं सांकेतिक शब्दों में बदलना करने की जरूरत बोली ही (") है - जो मामले में, मैं str_replace('"', '&quot;', ...) जैसे कुछ का उपयोग कर सकते हैं - लेकिन, मुझे यकीन नहीं है कि मैं इसे ठीक से समझ रहा हूं। HTML के लिए

decodeHTMLSpecialChars('http://someurl.com/foo?bar=1&amp;baz=2'); 
// => 'http://someurl.com/foo?bar=1&baz=2 

और नहीं,:

+2

उदाहरण urlencode PHP में इस बात का ध्यान रखना नहीं है मिल सकती है? टिप्पणियों में कुछ कोड उदाहरण हैं जो दिखाते हैं कि PHP मैन्युअल पर भी XSS के विरुद्ध सुरक्षा कैसे करें। http://php.net/manual/en/function.urlencode.php – GillesC

+0

@gillesc: 'urlencode()' एन्कोडिंग यूआरएल * पैरामीटर * के लिए है, पूरे यूआरएल नहीं, और HTML विशेषता संदर्भ के लिए एन्कोड नहीं करता है। मैनुअल में एक अनुभाग है जो इसके बारे में भी बात करता है - * "इसे छोड़ दें और, लेकिन htmlentities() या htmlspecialchars() का उपयोग करके अपने यूआरएल को एन्कोड करें।" * – FtDRbwLXw6

+0

क्या आप 'window.location = document.getElementById ('foo'); '? ऐसा होना चाहिए जैसा कि मुझे लगता है-> 'window.location = document.getElementById ('foo')। मान; 'और यह सही पृष्ठ पर रीडायरेक्ट करता है (foo? bar = 1 और baz = 2) – ocanal

उत्तर

11

htmlentities() या htmlspecialchars() का उपयोग करने का आपका वर्तमान पद्धति सही दृष्टिकोण है।

<input id="foo" type="hidden" value="foo?bar=1&amp;baz=2" /> 

मूल्य विशेषता में एम्परसेंड वास्तव में जरूरत है एचटीएमएल एन्कोड करने की, नहीं तो अपने HTML अमान्य है:

उदाहरण आपके द्वारा दी गई सही HTML है। अधिकांश ब्राउज़र इसे & के साथ सही तरीके से पार्स करेंगे, लेकिन यह इस तथ्य को नहीं बदलेगा कि यह अमान्य है और आप इसे एन्कोड करने के लिए सही हैं।

आपकी समस्या मूल्य के एन्कोडिंग में नहीं है, जो कि अच्छी है, लेकिन वास्तव में आप जावास्क्रिप्ट कोड का उपयोग कर रहे हैं जो इसे ठीक से डीकोड नहीं करता है।

वास्तव में, मैं इस पर हैरान हूं, क्योंकि आपका जेएस कोड डोम तक पहुंच रहा है, और डीओएम डीकोडेड मानों को वापस कर रहा है।

मैं खुद से यह साबित करने के लिए एक JSfiddle लिखा है: http://jsfiddle.net/qRd4Z/

इस चल रहा है, यह मुझे डीकोड मूल्य के साथ एक बॉक्स देता है के रूप में मैं उम्मीद थी। इसे console.log में बदलना मुझे अपेक्षित परिणाम भी देता है। तो मुझे यकीन नहीं है कि आपको अलग-अलग परिणाम क्यों मिल रहे हैं? शायद आप एक अलग ब्राउज़र का उपयोग कर रहे हैं? यह निर्दिष्ट करने लायक हो सकता है कि आप किसके साथ परीक्षण कर रहे हैं। या शायद आपने गलतियों से इकाइयों को दोबारा एन्कोड किया है? क्या आप पुष्टि कर सकते हैं कि यह मामला नहीं है?

0

आप डोम का उपयोग कर सकते मान को डीकोड करने के लिए:

'http://someurl.com/foo?bar=1&amp;baz=2' 
इस के लिए

:

function decodeHTMLSpecialChars(input){ 
    var div = document.createElement('div'); 
    div.innerHTML = input; 
    return div.childNodes.length === 0 ? "" : div.childNodes[0].nodeValue; 
} 

यह निम्न स्ट्रिंग प्रस्तुत करना होगा एन्कोडिंग और डिकोडिंग, htmlspecialchars और एचटीएमएल से बचने का मानक तरीका है और नौकरी कर रहा है तुम्हारे लिए ठीक नहीं है।

5

HTML विशेषता संदर्भ के लिए अविश्वसनीय डेटा को एन्कोड करने का उचित तरीका क्या है?

यदि आप विशेषता मान के चारों ओर डबल कोट जोड़ते हैं, तो htmlspecialchars() पर्याप्त है।

<input id="foo" type="hidden" value="foo?bar=1&amp;baz=2" /> 

यह सही है, और ब्राउज़र foo?bar=1&baz=2 (डीकोड &amp;) सर्वर से भेज देंगे। यदि सर्वर foo?bar=1&baz=2 नहीं देख रहा है, तो आपको मान को दो बार एन्कोड करना होगा।

जावास्क्रिप्ट में मान प्राप्त करना foo?bar=1&baz=2 भी वापस लौटना चाहिए (उदा। document.getElementById('foo').valuefoo?bar=1&baz=2 वापस करना होगा)।

अपने ब्राउज़र का उपयोग कर पृष्ठ का स्रोत देखें और इनपुट फ़ील्ड का वास्तविक स्रोत देखें।

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

BTW अपने कार्यक्रम गलत उपयोगकर्ता इनपुट की वजह से SEGFAULT नहीं होनी चाहिए;)

0

आप न सिर्फ PHPJS में html_entity_decode फ़ंक्शन का उपयोग किया जा सका:

http://phpjs.org/functions/html_entity_decode

उसके अलावा आप बेस 64 के बजाय अपने डेटा सांकेतिक शब्दों में बदलना कर सकते हैं ...

0

कृपया ध्यान दें कि यह नहीं करता है के रूप में htmlentities का उपयोग कर मदद नहीं!

डिफ़ॉल्ट रूप से यह सिर्फ encodes " < > &

यह ' जो एक समस्या बना सकते हैं बच नहीं करता है!

आप कार्यों के लिए झंडे का उपयोग सुनिश्चित करें, आप उपयोग और here

+0

धन्यवाद, लेकिन यह केवल तभी मायने रखता है यदि आप अपने गुणों के मूल्यों को ''' वर्णों के साथ सही तरीके से सीमित नहीं करते हैं, और मैं करता हूं।' '' डिलीमीटर को छोड़ना या '' 'के साथ सीमित होना बुरा व्यवहार है। – FtDRbwLXw6