如果我使用的是一个框架,它在存储在DB中时会转义输入,而XSS在正确使用时会自动清理输出(只允许几个标签(,
只存储由所见即所得编辑器(如CKEditor(创建的内容,然后在网站上显示这些内容,安全吗?还是使用某种Markdown语言更好?
使用不同的标记(例如Markdown(来存储用户输入的html是一种蠕虫。很多复杂性,并且不会自动解决您的问题(主要是XSS(。您可以只存储经过消毒的已使用输入(如果您愿意,甚至可以存储原始的未初始化用户输入,请参阅下文(。
关键是,在向页面DOM添加用户输入之前,您需要删除Javascript。由于这些编辑器往往具有预览功能,根本不向服务器发送数据,因此通常最好通过编辑器提供的挂钩在客户端删除javascript。在CKEditor的情况下,一个这样的钩子似乎是contentPreview
事件(不过我对CKEditor不是很熟悉(。
因此,您应该有一个javascript库,它接受一堆html代码(编辑器的输出(,并返回相同的html,但删除了任何javascript。GoogleCaja有这样一个客户端html清理程序组件,还有其他这样的库。这应该在预览时(之前(运行,因此在实际查看内容之前删除所有javascript。在显示从服务器接收的内容之前也应该执行同样的操作(无论存储已净化或未初始化的数据(。
是否要在将数据发送到服务器之前进行此清理取决于您的用例。你并不严格需要这样做,但你必须小心如何在其他潜在的应用程序中使用这些数据(例如,另一个"admin"或"management"应用程序可能会以不安全的方式显示它——不应该是这样,因为这将是另一个应用程序中的XSS(。
还要注意,即使删除了所有javascript,用户输入的html仍然可能存在其他潜在的漏洞。例如,能够嵌入一个源指向另一个网站的图像可能会让攻击者跟踪应用程序页面的使用情况。能够链接到外部网站可能会允许攻击者进行网络钓鱼攻击等。这取决于您的确切用例和威胁模型,而这些都不会仅通过清除来阻止。