ASP.Net的富文本验证器

时间:2013-02-12 14:56:18

标签: c# telerik richtextbox

所以我有一个与此问题非常类似的问题:Input Validation When Using a Rich Text Editor

但这与XSS脚本无关。我们在ASP.Net上开发了一个使用Telerik富文本编辑器的内部工具。用户应该只能使用一些可用的格式化(例如粗体,斜体,列表,特殊字符)。

我的问题是,有时用户会从未知来源(Word,RTF,网页)复制/粘贴文本,而且所有粘贴的原始数据都不正确(缺少列表的最后结束标记等)。 当我尝试使用这些数据时,它会导致很多问题。

我希望能够验证数据是否已更正。我想确保只使用我们允许的标签,并且我们没有任何遗漏的结束标签。

XSS不是问题,因为我们正在开发可信用户可用的内部应用程序。

我想到了Dtd,但我不确定这可以用于Rich Text格式,因为它不是纯XML ......

有没有人已经使用了某些东西并想出来了?

1 个答案:

答案 0 :(得分:0)

所以我终于找到了办法!

你可以使用Telerik剥离混合使用:StripFormattingOptions =“Css,Font,Span,ConvertWordLists”

并在HTML粘贴OnClientPasteHtml =“onClientPasteHtml”上使用一些javascript。

以下是删除不需要的标记的代码

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]);
            }
        }
    }

我们还在dtd 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));
    }

验证会将格式错误添加到列表中。然后,您只需在页面中显示所需的消息。

希望这会有所帮助 (如果您发现该解决方案的一些增强功能,请毫不犹豫地告诉我:))