2008-10-15 16 views
19

का उपयोग करके HTML शामिल नहीं है क्या किसी के पास यह जांचने का एक सरल, कुशल तरीका है कि स्ट्रिंग में HTML नहीं है? असल में, मैं यह जांचना चाहता हूं कि कुछ फ़ील्ड में केवल सादा पाठ हो। मैंने < चरित्र की तलाश करने के बारे में सोचा, लेकिन इसे सादे पाठ में आसानी से उपयोग किया जा सकता है। एक और तरीका है का उपयोग कर एक नया System.Xml.Linq.XElement बनाने के लिए हो सकता है:यह सत्यापित करने के लिए कि एक स्ट्रिंग में सी #

XElement.Parse("<wrapper>" + MyString + "</wrapper>") 

और जाँच लें कि XElement कोई भी बच्चा तत्व शामिल हैं, लेकिन यह मैं क्या जरूरत के लिए एक छोटे से हैवीवेट लगता है।

+0

, तो आप शायद आप, "एचटीएमएल" और "सादा पाठ" द्वारा क्या मतलब है, उदाहरण के लिए परिभाषित करने के लिए करने जा रहे हैं ऐसा करने के लिए: यदि आप किसी को "" डाल करने के लिए सादा पाठ, में सकेगा.आप लगता है * एक HTML तत्व जैसा है लेकिन यह नहीं है, और यह भी, आप कौन से पात्रों की अनुमति देंगे .. – Rob

+0

मेरे मामले में, मैं बिल्कुल कोई टैग नहीं कह रहा हूं, इसलिए की अनुमति नहीं दी जाएगी। मेरे उपयोगकर्ता सीमित संख्या में कर्मचारी हैं जो हमारी कंपनी की वेबसाइट में उत्पादों को दर्ज करते हैं। उन्होंने खेतों में थोड़ा सा दुरुपयोग करना शुरू कर दिया है और उन HTML में HTML शामिल करें जिन्हें HTML शामिल करने के लिए डिज़ाइन नहीं किया गया था। –

उत्तर

6

मैं बस अपना XElement.Parse समाधान की कोशिश की। मैं स्ट्रिंग वर्ग पर एक विस्तार विधि बनाया तो मैं आसानी से कोड का पुन: उपयोग कर सकते हैं: (

public static bool ContainsXHTML(this string input) 
{ 
    try 
    { 
     XElement x = XElement.Parse("<wrapper>" + input + "</wrapper>"); 
     return !(x.DescendantNodes().Count() == 1 && x.DescendantNodes().First().NodeType == XmlNodeType.Text); 
    } 
    catch (XmlException ex) 
    { 
     return true; 
    } 
} 

एक समस्या यह है मैंने पाया था कि सादा पाठ एम्परसेंड और अक्षरों से कम एक XmlException कारण और संकेत मिलता है कि क्षेत्र एचटीएमएल शामिल है जो गलत)। इसे ठीक करने के लिए, पहले स्ट्रिंग में इनपुट स्ट्रिंग को एम्परसैंड और उनके समकक्ष एक्सएचटीएमएल इकाइयों में परिवर्तित वर्णों से कम होना चाहिए।मैं एक और विस्तार विधि ने लिखा है कि ऐसा करने के लिए:

public static string ConvertXHTMLEntities(this string input) 
{ 
    // Convert all ampersands to the ampersand entity. 
    string output = input; 
    output = output.Replace("&amp;", "amp_token"); 
    output = output.Replace("&", "&amp;"); 
    output = output.Replace("amp_token", "&amp;"); 

    // Convert less than to the less than entity (without messing up tags). 
    output = output.Replace("< ", "&lt; "); 
    return output; 
} 

अब मैं एक उपयोगकर्ता प्रस्तुत स्ट्रिंग लेने के लिए और जांच करें कि यह निम्नलिखित कोड का उपयोग कर एचटीएमएल शामिल नहीं है कर सकते हैं:

bool ContainsHTML = UserEnteredString.ConvertXHTMLEntities().ContainsXHTML(); 

मैं सुनिश्चित नहीं हूं अगर यह बुलेट प्रमाण है, लेकिन मुझे लगता है कि यह मेरी स्थिति के लिए काफी अच्छा है।

+0

आप यह सुनिश्चित करने के लिए जांच कर रहे हैं कि इसमें एक्सएचटीएमएल नहीं है। आप यह सुनिश्चित करने के लिए जांच नहीं कर रहे हैं कि इसमें HTML शामिल नहीं है, जो कि अच्छी तरह से गठित XML नहीं होना चाहिए। साथ ही, आपका कोड "नहीं पकड़ पाएगा यह एक्सएचटीएमएल है"। –

+0

दरअसल, पुरानी स्टाइल एचटीएमएल जो अच्छी तरह से बनाई गई एक्सएमएल नहीं है XElement.Parse विधि विफल होने का कारण बन जाएगी। मेरी विधि मानती है कि पार्स विधि विफल होने का अर्थ है कि स्ट्रिंग में HTML का कुछ रूप शामिल है। मुझे लगता है कि मेरा कोड वास्तव में टैग के किसी भी रूप की तलाश में है। –

+0

हम उद्घाटन टैग खोलने के लिए रेगेक्स पैटन का भी उपयोग कर सकते हैं। – bijayk

44

निम्नलिखित टैग के मिलान मिलान से मेल खाएगा। अर्थात < b> इस </b>

Regex tagRegex = new Regex(@"<\s*([^ >]+)[^>]*>.*?<\s*/\s*\1\s*>"); 

निम्नलिखित किसी भी एक टैग का मिलान करेंगे। यानी < बी> (इसे बंद नहीं किया जाना चाहिए)।

Regex tagRegex = new Regex(@"<[^>]+>"); 

फिर आप इसे पसंद तो

bool hasTags = tagRegex.IsMatch(myString); 
8

यहां आपको उपयोग कर सकते हैं:

using System.Text.RegularExpressions; 
private bool ContainsHTML(string CheckString) 
{ 
    return Regex.IsMatch(CheckString, "<(.|\n)*?>"); 
} 

सबसे आसान तरीका है कि, के बाद से कोष्ठक में आइटम स्वाभाविक रूप से होने की संभावना नहीं है।

2

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

एक एएसपी.Net पृष्ठ पर, अगर validateRequest = machine.config, web.config या पृष्ठ निर्देश में सत्य है, तो उपयोगकर्ता को एक संभावित पृष्ठ मिलेगा जिसमें "संभावित रूप से खतरनाक अनुरोध। क्लाइंट से फॉर्म मान पता चला था" यदि एक HTML टैग या कई अन्य संभावित स्क्रिप्ट-इंजेक्शन हमलों का पता चला है। आप शायद इससे बचें और अधिक सुरुचिपूर्ण, कम डरावनी यूआई अनुभव प्रदान करें।

आप एक नियमित अभिव्यक्ति का उपयोग करके < दोनों खोलने और समापन टैग दोनों के लिए परीक्षण कर सकते हैं, और टेक्स्ट को अनुमति दें यदि उनमें से केवल एक ही होता है। < या>, लेकिन < के बाद कुछ पाठ और उसके बाद, उस क्रम में अनुमति दें।

आप कोण को ब्रैकेट और एचटीएमएल को टेक्स्ट को जारी रखने के लिए पाठ को अनुमति देने के लिए अनुमति दे सकते हैं।

+0

यदि SQL इंजेक्शन से निपटने के लिए आपकी रणनीति इनपुट से बाहर हो रही है, तो आपको एक बड़ी समस्या है। –

+1

उत्कृष्ट बिंदु, रॉबर्ट, लेकिन मुझे नहीं लगता था कि यह एसक्यूएल इंजेक्शन, या अन्य स्क्रिप्ट इंजेक्शन तकनीकों के खिलाफ रक्षा की पूर्ण व्याख्या में लॉन्च करने का स्थान था। एसक्यूएल इंजेक्शन के खिलाफ रक्षा की मेरी पहली पंक्ति पैरामीटरयुक्त एसक्यूएल का उपयोग कर रही है। आपका क्या है? – DOK

20

आप HttpUtility.HtmlEncode का उपयोग कर इनपुट एन्कोड करके सादा पाठ सुनिश्चित कर सकते हैं।

वास्तव में, कैसे सख्त आप चेक होना चाहते हैं पर निर्भर करता है, आप इसे उपयोग निर्धारित करने के लिए स्ट्रिंग एचटीएमएल शामिल हो सकते हैं:

bool containsHTML = (myString != HttpUtility.HtmlEncode(myString)); 
+1

एक सरल लेकिन प्रभावी जवाब! –

+7

दुर्भाग्यवश काम नहीं करता है यदि आपकी स्ट्रिंग में एस्ट्रोफ़ेस, एम्परसेंड इत्यादि – PeteG

+0

@PeteG अच्छा बिंदु है, हां, ऐसा लगता है कि .NET 4 में शुरू करना यह विधि वास्तव में एकल कोट्स जैसे उपयोग की तुलना में अधिक चीजों को एन्कोड करता है। यह इस तकनीक को कम उपयोगी बनाता है। –

0

ऊपर वर्णित HttpUtility.HtmlEncode विधि का उपयोग करते समय सावधान रहें। यदि आप विशेष वर्णों के साथ कुछ पाठ जांच रहे हैं, लेकिन HTML नहीं, तो यह गलत तरीके से मूल्यांकन करेगा। हो सकता है कि यही कारण है कि जे सी ने "... पर निर्भर करता है कि आप कितनी सख्त जांच चाहते हैं ..."

3

यह वैकल्पिक व्हाइटसाइट के साथ < br /> स्वयं संलग्न टैग जैसी चीजों की भी जांच करता है। सूची में नए एचटीएमएल 5 टैग नहीं हैं।

internal static class HtmlExts 
{ 
    public static bool containsHtmlTag(this string text, string tag) 
    { 
     var pattern = @"<\s*" + tag + @"\s*\/?>"; 
     return Regex.IsMatch(text, pattern, RegexOptions.IgnoreCase); 
    } 

    public static bool containsHtmlTags(this string text, string tags) 
    { 
     var ba = tags.Split('|').Select(x => new {tag = x, hastag = text.containsHtmlTag(x)}).Where(x => x.hastag); 

     return ba.Count() > 0; 
    } 

    public static bool containsHtmlTags(this string text) 
    { 
     return 
      text.containsHtmlTags(
       "a|abbr|acronym|address|area|b|base|bdo|big|blockquote|body|br|button|caption|cite|code|col|colgroup|dd|del|dfn|div|dl|DOCTYPE|dt|em|fieldset|form|h1|h2|h3|h4|h5|h6|head|html|hr|i|img|input|ins|kbd|label|legend|li|link|map|meta|noscript|object|ol|optgroup|option|p|param|pre|q|samp|script|select|small|span|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|title|tr|tt|ul|var"); 
    } 
} 
संबंधित मुद्दे

 संबंधित मुद्दे