मैंने हाल ही में इस समस्या पर कुछ समय बिताया। यहां मेरे समाधान की रूपरेखा है।
मैंने एचटीएमएलएफ़ नामक एक नई कक्षा बनाई जिसमें स्ट्रिंग्स शामिल हैं जिन्हें सुरक्षित भेद्यता के बिना डब्ल्यूडब्ल्यूडब्ल्यू क्लाइंट को सुरक्षित रूप से लिखा जा सकता है। विचार यह था कि HTML टैग जेनरेट करने वाले फ़ंक्शंस HtmlSafe ऑब्जेक्ट्स लौटाते हैं, और बॉक्स के बाहर वेरिएबल्स HtmlSafe नहीं हैं। जो भी एचटीएमएलएफ़ बनाता है वह भी स्ट्रिंग के लिए सुरक्षा के लिए सुरक्षा के लिए झुका हुआ है। एचटीएमएल-सुरक्षित स्ट्रिंग के साथ एक गैर-एचटीएमएल-सुरक्षित स्ट्रिंग को संगत करने से गैर-एचटीएमएल-सुरक्षित स्ट्रिंग को CGI :: escapeHTML के माध्यम से भागने का कारण बनता है, और फिर HTML- सुरक्षित स्ट्रिंग के साथ जुड़ जाता है। एचटीएमएलएफ़ के एचटीएमएलएफ़ के दूसरे उदाहरण को जोड़ना बिना बचने के प्रश्न में स्ट्रिंग्स में शामिल हो जाता है। मैं एक अधिभार का उपयोग कर समाप्त हुआ ताकि मैं फिर से परिभाषित कर सकूं। एचटीएमएलएफ़ कक्षा के लिए ऑपरेटर।
इस बात के साथ सशस्त्र, मैं एक $ टेम्पलेट> प्रक्रिया दे दी है() एक $ उत्पादन चर वास्तव में एक उप कि HtmlSafe के साथ एक संयोजन लागू, इस तरह किया गया है कि काम करते हैं:
my $output = HtmlSafe->new("");
$template->process($vars, sub { $output .= $_[0]; });
return $output->unwrap(); # remove HtmlSafe and return underlying string
हम लगभग तैयार हैं एचटीएमएलएफ़ टीटी 2 के साथ। बड़े बदलाव को मुझे वास्तव में करना था था टेम्पलेट :: निर्देश में टेक्स्टब्लॉक() फ़ंक्शन को बदलने के लिए, जिसका उपयोग टेम्पलेट :: पार्सर द्वारा एचटीएमएलएफ़ उदाहरणों को उत्पन्न करने के लिए किया जाता है ताकि जो भी टेक्स्ट ब्लॉक इसे निकालने का प्रयास किया जा सके। ये पार्स टेम्पलेट के पाठ नोड के साथ अनुरूप करने के लिए प्रकट तो बस कर
package MyDirective;
use base "Template::Directive";
sub textblock { my $self = shift; return "$Template::Directive::OUTPUT HtmlSafe->new(" . $self->text(@_) . ")"; }
जो मुझे बहुत पसंद है पार्सर को दे दिया:
my $parser = Template::Parser->new({
FACTORY => "MyDirective",
});
इस के अलावा, मैं एक "कोई नहीं" फिल्टर परिभाषित टीटी 2 के लिए जो एचटीएमएलएफ़ के रूप में परिभाषित किया गया है, तो आप कच्चे HTML को आउटपुट कर सकते हैं यदि आपको करना है। यह चीजों से बचने से बचाता है। डिफ़ॉल्ट "एचटीएमएल" फ़िल्टर नो-ऑप है, क्योंकि एचटीएमएलएफ़ से जुड़ा कुछ भी वैसे भी बच निकला है।
स्रोत
2016-09-30 18:58:04
एक कस्टम टेम्पलेट :: स्टैश शायद पर्याप्त नहीं होगा।''% X%] 'और' [% y = x%] '' x' को देखने के लिए स्टेश की 'get()' विधि को कॉल करेंगे, लेकिन केवल पहले उत्पादन का उत्पादन करेगा, संभवतः स्टैश संभवतः सक्षम नहीं होगा "प्राप्त करें और प्रिंट करें" के बीच अंतर बताएं और बस "प्राप्त करें" ताकि आप बहुत डबल/ट्रिपल/... HTML एन्कोडेड सामान के साथ समाप्त हो जाएंगे। शायद परेशान नहीं करने के लिए सबसे अच्छा है। –
टीटी का डिज़ाइन दार्श डिफ़ॉल्ट रूप से क्रॉस-साइट स्क्रिप्टिंग हमलों की अनुमति देना है और यक शेविंग की अत्यधिक मात्रा में सुरक्षा की अनुमति देता है। – geira
हाँ जो टीटी दर्शन में फिट होने के लिए बहुत सुविधाजनक होगा .. – jeje