0

だから私はこれにかなり似ている質問があります:リッチテキストエディタを使用するときの入力検証

ただし、これはXSSスクリプトとは関係ありません。Telerik RichTextEditorを使用するASP.Netで開発された内部ツールがあります。ユーザーは、使用可能なフォーマットの一部(太字、斜体、リスト、特殊文字など)のみを使用できるようになっています。

私の問題は、ユーザーが不明なソース(Word、RTF、Webページ)からテキストをコピーして貼り付けることがあり、貼り付けられたすべての生データが正しくない(リストの最後の終了タグがないなど)場合があることです。これらのデータを使おうとすると、多くの問題が発生します。

データが正しいことを検証できるようにしたいと思います。許可したタグのみを使用でき、終了タグが欠落していないことを確認したいと思います。

信頼できるユーザーが利用できる内部アプリケーションに取り組んでいるため、XSSは問題ではありません。

Dtdについて考えましたが、純粋なXMLではないため、これがリッチテキスト形式で機能するかどうかはわかりません...

誰かがすでに何かを使用してこれを理解しましたか?

4

1 に答える 1

0

だから私はついにそれを行う方法を見つけました!

これは、StripFormattingOptions = "Css、Font、Span、ConvertWordLists"を使用してTelerikストリッピングを組み合わせて行うことができます。

OnClientPasteHtml="onClientPasteHtml"を貼り付けるHTMLに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]);
            }
        }
    }

また、コピーカットがタグ(リストの開始タグと終了タグなど)を忘れていないかどうかを通知する、dtdXHTML検証に基づくバリデーターベースを追加しました。そのために、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));
    }

検証により、フォーマットエラーがリストに追加されます。次に、必要なメッセージをページに表示する必要があります。

これがお役に立てば幸いです(そして、そのソリューションの機能強化を見つけたら、遠慮なく教えてください:))

于 2013-02-19T13:44:28.780 に答える