我有一个编辑器,允许用户添加存储在数据库中并在网页上呈现的HTML.由于这是不受信任的输入,我打算Microsoft.Security.Application.AntiXsSS.GetSafeHtmlFragment
用来清理HTML.
我应该在保存到数据库之前还是在将不受信任的输入呈现到网页之前进行实体化?
将AntiXSS源代码包含在我的项目而不仅仅是DLL中是否有优势?(也许我可以自定义白名单?)
我应该查看哪个类文件来实际实现GetSafeHtmlFragment
blowdart.. 32
由于两个原因,我不同意所选答案
如果存储了编码数据,则必须在存储之前选择编码器.如果您将某些内容存储为HTML但又希望以其他格式将其推出(例如作为JSON响应或作为XML文档的一部分),会发生什么?您现在有一个必须解码的HTML编码格式,然后以正确的格式进行编码.
如果我们发现编码器中的错误并推出新版本怎么办?现在,因为您没有在输出点进行编码,所有旧数据可能包含错误编码的内容.你可以再次编码,但是你遇到了双重编码问题,这些问题可能会很难正确过滤.
通常,您在输出点进行编码,并将来自数据存储的任何数据视为默认情况下不受信任 - 毕竟,如果有人设法直接编辑数据库或通过SQL注入,该怎么办?
由于两个原因,我不同意所选答案
如果存储了编码数据,则必须在存储之前选择编码器.如果您将某些内容存储为HTML但又希望以其他格式将其推出(例如作为JSON响应或作为XML文档的一部分),会发生什么?您现在有一个必须解码的HTML编码格式,然后以正确的格式进行编码.
如果我们发现编码器中的错误并推出新版本怎么办?现在,因为您没有在输出点进行编码,所有旧数据可能包含错误编码的内容.你可以再次编码,但是你遇到了双重编码问题,这些问题可能会很难正确过滤.
通常,您在输出点进行编码,并将来自数据存储的任何数据视为默认情况下不受信任 - 毕竟,如果有人设法直接编辑数据库或通过SQL注入,该怎么办?
在XSS上与Jeff Williams一起收听OWASP播客67.他谈到在存储之前不进行消毒或编码.主要原因是,如果(当)库发展以响应新的漏洞,您的数据将被卡在旧版本中.当然,这并不能阻止您在入口点针对白名单运行任何输入并拒绝任何超出可接受范围的内容.