2013-02-12 3 views
0

Так у меня есть вопрос, который очень похож на этот: Input Validation When Using a Rich Text Editorформатированный текст валидатор для ASP.Net

Но это не связано с XSS сценариев. У нас есть внутренние инструменты, разработанные на ASP.Net, которые используют текстовый редактор Telerik Rich Text Editor. Предполагается, что пользователи могут использовать только некоторые доступные формации (такие как Bold, Italic, List, специальные символы).

Моя проблема в том, что иногда пользователи копируют/вставляют текст из неизвестных источников (Word, RTF, веб-страницы), и бывает так, что все эти необработанные вставленные данные неверны (отсутствуют последние закрывающие теги для списка и т. Д.). Это приводит к множеству проблем, когда я пытаюсь использовать эти данные.

Я хотел был бы быть уверен, что данные верны. Я хочу быть уверенным, что можно использовать только те теги, которые мы допустили, и что у нас нет отсутствующих закрывающих тегов.

XSS не является проблемой, так как мы работаем над внутренним приложением, доступным доверенным пользователям.

Я думал ОТД, но я не уверен, что это может работать с Rich текстовом формате, как это не чистый XML ...

Кто-нибудь уже использовал что-то и понял это?

+0

Вы играли с [RadEditor.StripFormattingOptions собственности] (HTTP: // WWW. telerik.com/help/aspnet-ajax/p_telerik_web_ui_radeditor_stripformattingoptions.html) уже? –

+0

Да, к сожалению, нам нужно сохранить какой-нибудь дом html-тегов, поэтому опция отсечения на самом деле не является решением для нас ... – Guigui

ответ

0

Итак, я наконец нашел способ сделать это!

Вы можете сделать это с помощью смеси Telerik отпарной с помощью: StripFormattingOptions = "Css, шрифт, Span, ConvertWordLists"

и используя некоторые JavaScript на HTML оклейки OnClientPasteHtml = "onClientPasteHtml".

Вот код, который удалит нежелательные теги

function onClientPasteHtml(editor, args) { 
     var commandName = args.get_commandName(); 
     var value = args.get_value(); 

     if (commandName == "Paste") { 
      //create a div, set the html content to it, 
      // remove style attribute, remove non pertinent tags. 
      var div = document.createElement("DIV"); 
      Telerik.Web.UI.Editor.Utils.setElementInnerHtml(div, value); 

      var nostyle = $(div)[0]; 

      // replace unwanted tags 
      var strippedHtml = $(nostyle).html().replace(/<\/?([a-z]+)[^>]*>/gi, function (match, tag) { 

       // any of these is valid 
       tag = tag.toLowerCase(); 
       return (tag === "em" || tag === "ol" || 
         tag === "sub" || tag === "sup" || tag === "ul" || tag === "li"|| tag === "br" || tag === "i") ? match : ""; 
      }); 

      // attributes gone 
      Telerik.Web.UI.Editor.Utils.setElementInnerHtml(div, strippedHtml); 
      removeAttributes($(div)[0]); 

      strippedHtml = $(div).html(); 

      args.set_value(strippedHtml); 
     } 

    } 

    function removeAttributes(el) { 

     while (el.attributes.length > 0) { 
      el.removeAttribute(el.attributes[0].name); 
     } 

     if (el.childNodes.length > 0) { 
      for (var child in el.childNodes) { 
       if (el.childNodes[child].nodeType == 1) 
        removeAttributes(el.childNodes[child]); 
      } 
     } 
    } 

Также мы добавили валидатор базу на ОТД проверки XHTML, который расскажет нам, если вырезать копию не забыть любые метки (например, открытие и закрывающий тег для списка). Для этого мы использовали xhtml1-transitional.dtd:

protected bool ValidateMaisRespProjectText() 
    { 
     string html = txtJobMainResp.GetHtml(EditorStripHtmlOptions.None); 


     XHtmlErrors = new List<string>(); 

     XmlReaderSettings settings = new XmlReaderSettings(); 
     settings.ProhibitDtd = false; 
     settings.ValidationType = ValidationType.DTD; 
     settings.ValidationEventHandler += new ValidationEventHandler(ValidationEventHandler); 

     // Create a local reference for validation11.    
     string xhtmlDtdFile = HttpContext.Current.Server.MapPath("DTD/xhtml1-transitional.dtd"); 
     string newDoctype = string.Format("<!DOCTYPE html SYSTEM \"file://{0}\">", xhtmlDtdFile); 

     // add doc type validation + root element to make it valid. 
     html = newDoctype + Environment.NewLine + "<html><head><title>title</title></head><body><div>" + html + "</div></body></html>"; 

     XmlReader reader = XmlReader.Create(new System.IO.StringReader(html), settings); 
     try 
     { 
      while (reader.Read()) 
      { 
      } 
     } 
     catch (Exception ex) 
     { 
      XHtmlErrors.Add(ex.Message); 
      txtJobMainRespValidator1.IsValid = false; 
      txtJobMainRespValidator1.Text = "* The information entered has invalid HTML content. (DEBUG: " + XHtmlErrors.FirstOrDefault() + ")"; 
     } 
     finally 
     { 
      if (reader != null) 
       reader.Close(); 

     } 
     if (XHtmlErrors.Count != 0) 
     { 
      txtJobMainRespValidator1.IsValid = false; 
      txtJobMainRespValidator1.Text = "* The information entered has invalid HTML content. (DEBUG: " + XHtmlErrors.FirstOrDefault() + ")"; 
     } 
     return XHtmlErrors.Count == 0; 
    } 

private void ValidationEventHandler(object sender, ValidationEventArgs e) 
    { 
     XHtmlErrors.Add(string.Format("({0}) {1} - [Line: {2}, Char: {3}]", e.Severity, e.Message, e.Exception.LineNumber, e.Exception.LinePosition)); 
    } 

Проверка добавляет ошибки форматирования в списке. Затем вам просто нужно отобразить сообщения, которые вы хотите на своей странице.

Надеется, что это поможет (И если вы найдете некоторые повышения к этому решению, не стесняйтесь сказать мне :))

Смежные вопросы