所以我有一个与此问题非常类似的问题:Input Validation When Using a Rich Text Editor
但这与XSS脚本无关。我们在ASP.Net上开发了一个使用Telerik富文本编辑器的内部工具。用户应该只能使用一些可用的格式化(例如粗体,斜体,列表,特殊字符)。
我的问题是,有时用户会从未知来源(Word,RTF,网页)复制/粘贴文本,而且所有粘贴的原始数据都不正确(缺少列表的最后结束标记等)。 当我尝试使用这些数据时,它会导致很多问题。
我希望能够验证数据是否已更正。我想确保只使用我们允许的标签,并且我们没有任何遗漏的结束标签。
XSS不是问题,因为我们正在开发可信用户可用的内部应用程序。
我想到了Dtd,但我不确定这可以用于Rich Text格式,因为它不是纯XML ......
有没有人已经使用了某些东西并想出来了?
答案 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));
}
验证会将格式错误添加到列表中。然后,您只需在页面中显示所需的消息。
希望这会有所帮助 (如果您发现该解决方案的一些增强功能,请毫不犹豫地告诉我:))