当客户要求在其网站上进行RTF编辑时,您会怎么做?


18

众所周知,XSS攻击很危险,而且很容易发动。像ASP.NET MVC一样,各种框架使对HTML进行编码变得容易:

<%= Html.Encode("string"); %>

但是,当您的客户要求他们能够直接从Microsoft Word文档上载其内容时,会发生什么情况?

这是场景:人们可以将Microsoft Word中的内容复制并粘贴到WYSIWYG编辑器(在本例中为tinyMCE)中,然后将该信息发布到网页上。

该网站是公开的,但是只有该组织的成员才能访问该网页上的信息。

如何以安全的方式处理这些要求?目前,还没有检查客户发布的内容(因为只有“受信任的”用户可以发布),但是我对此并不特别满意,如果帐户被黑客入侵,我想将其进一步锁定。

我知道,满足这些要求的唯一概念性方法是将HTML标签列入白名单,并让它们通过。还有另一种方法吗?如果不是,有什么安全的方法可以让用户以任何形式将输入存储在数据库中,而只显示正确编码并清除不良标签的输入?

相关问题

防止跨站点脚本(XSS)


尼斯question-这里是一个类似though- stackoverflow.com/questions/445177/...
RichardOD

同意 相似,但是这是一个令人困惑的问题(很难找到该问题),并且它没有专门询问是否还有其他方法。如果有另一种无需白名单即可呈现HTML的方法,那么我就无所谓了。如果有一个ASP.NET MVC View Engine可以解决这个问题,那么也很高兴知道。
乔治·斯托克

关于非安全性,从用户界面的角度来看,过滤标签可能会有所帮助。意外键入尖括号而忘记将其遗忘是非常容易的。由于我们所讨论的是从Word复制的用户,因此,最好捕获看起来像不良标签的内容并对其进行适当编码(即&amp; lt;),以便事情正常进行。

关于第4点:您敢打赌,这仍然是一个问题!毕竟,大多数黑客都是内部工作。对于特定的编辑器,我使用FreeTextBox的过程很顺利,但是我不能说它与您的要求(特别是MVC)的匹配程度如何。
Joel Coehoorn

1
@gnat谢谢;编辑。看来我的问题已经引起了某种集团的注意;三个连续的投票,以及您的保护和编辑请求。
乔治·斯托克

Answers:


8

最简单的方法(对于您作为开发人员而言)可能是实现Markdown的许多变体之一,例如Markdown.NET或什至更好的是(imho)wmd-editor

然后,您的用户将能够粘贴简单的HTML,但没有任何危险,并且即使在发布之前,他们也可以预览输入的数据并弄清所有细节。


我相信StackOverflow使用了不需要WMD语法的自定义编辑器
Jon


WMD语法是什么意思?据我所知,所有WMD语法都能正常工作。而且我还没有找到任何行不通的方法……

2
使用Markdown的问题在于markdown允许任意HTML;因此,就其本身而言,这不是解决方案。
乔治·斯托克

7

当允许用户直接或使用RTF编辑器输入HTML时,将白名单确实是防止XSS攻击的最佳方法。

关于您的其他问题:

有一个所见即所得的编辑器,该编辑器包括即时将白名单添加到白名单的功能吗?

我认为这行不通。为此,您需要服务器端代码,并且RTE在客户端上运行。

TinyMCE可以根据需要过滤标签,但是由于它发生在浏览器中,因此您无法信任它。请参阅extended_valid_elements。TinyMCE(Moxie)也建议将其列入白名单,请参见此处

我什至应该为此担心,因为它仅用于“私人发布”

除非有特殊原因(除非很少),否则您应该始终过滤HTML。某些原因:a)今天为内部用户使用的功能,或者明天为明天的公众使用的功能b)未经授权的访问影响较小

最好的方法是让他们以任何形式将其存储在数据库中,而仅将其正确编码并去除不良标签?

那就是我喜欢的方式。由于各种原因,我不希望在插入数据库之前更改用户输入。


-1

我在做同样的事情。我正在使用TinyMCE,并允许从Word文档粘贴。只有维护网站的某些人可以通过管理区域来执行此操作。这由ASP.Net成员身份保护。我很简单地将HTML.Encode发送到公共站点。

如果您愿意,可以在下面的代码中使用以下代码,但不确定对它有什么影响。您可能必须遵循白名单。

 /// <summary>
    /// Strip HTML
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static string StripHTML(string str)
    {
        //Strips the HTML tags from strHTML 
        System.Text.RegularExpressions.Regex objRegExp = new System.Text.RegularExpressions.Regex("<(.|\n)+?>");

        // Replace all tags with a space, otherwise words either side 
        // of a tag might be concatenated 
        string strOutput = objRegExp.Replace(str, " ");

        // Replace all < and > with < and > 
        strOutput = strOutput.Replace("<", "<");
        strOutput = strOutput.Replace(">", ">");

        return strOutput;
    }

如果他们存储诸如<script> alert(“ hey”)</ script>之类的文本,而您执行Html.Encode(<script> alert(“ hey”)</ script>),它将仅打印该页面而不运行警报
乔恩

我没有使用白名单,而是按原样存储它。上面的功能可能会有所帮助,但我不知道会产生什么样的影响。想知道您的决定。为什么我的帖子被标记为负面?
乔恩

1
我猜这是因为您的软件的执行方式非常幼稚。有各种各样的技巧可以解决您的实现问题。
乔治·斯托克

4
白名单是一个好主意,但是您的方法肯定不是。正则表达式不是检测文本标签的可靠方法,因为HTML可能会变得很模糊。使用诸如HTML Agility Pack之类的库更好。
Noldorin

-1

一种选择可能是.NETHTML编辑控件(我写的)。

它是.NET的WYSIWYM HTML编辑器,仅支持HTML元素的子集,不包括<script>元素:因此,它充当白名单。

如果供内部使用(即Intranet站点),则控件可以嵌入到网页中

我没有集成对Word粘贴的支持,但是我确实有一个组件朝这个方向迈出了一步:Doc到HTML转换器;因此,我有了一些构建块,您可以在ASP.NET中使用这些构建块将Doc转换为HTML,在编辑器中显示HTML,等等。


-2

我的恕我直言,一直信任您的用户,直到您公开。

嗯,没有可靠的方法可以满足您的需求。例如,任何WYSIWYG编辑器都无法保护带有URL(间接使用跟踪,非法内容)或文本(非法文本,拼写错误的文本,错误的文本)的表单插入图像。

我的观点是,如果您可以信任您的用户,则只需允许所有操作,就警告用户是否存在危险的标记(以防止他们出错)。

如果您不信任,请使用某种特殊的标记(例如Markdown)。

在我的项目中,我们使用特殊类型表示潜在的危险内容,并使用特殊方法呈现和接受此类内容。该代码在我们的线程模型中具有很高的知名度,并且对它的关注度很高(例如,每个更改都应由两个独立的编码人员进行审查,我们具有全面的测试套件,等等)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.