我现在的雇主在数据库中存储产品说明,以便在我们的在线目录中以HTML格式使用。例如,通常存储此类事物:
<strong>Book 1</strong><br /><em>This book will help you know the things.</em>
虽然它闻起来很糟糕而且我不喜欢它,否则在可预见的未来处理它不是一种选择。
产品描述并不总是包含标记,因此我创建了一个工具,允许业务人员在仅限员工的界面内更新产品描述。但“仅限员工”包括没有任何技术理解的销售人员和商务人士。我目前从文本框中获取输入,然后将其存储在数据库中以便在网站上显示。像下面这样的东西被参数化和存储。
string productDescription = tbxDescription.Text;
然后显示在MVC页面上......
@Html.Raw(Model.ProductDescription)
不幸的是(或幸运的是),当这些用户在该文本框中保存尖括号和其他标记时,事情就会爆炸,因为文本不是URL编码的。我正在考虑简单地编码文本框输入的选项,但是我担心人们能够保存JavaScript的其他代码的安全风险,这些代码只会被转储到页面上。
string productDescription = WebUtility.UrlEncode(tbxDescription.Text);
所以我的问题有两个部分:
还有一条背景信息:我并不十分关注我们的商务人员恶意将坏东西插入我们的数据库或将其粘贴在网页上。我更关心那些用户是其他类型攻击的受害者。我无论如何都不是安全专家,所以我只想尽力了解风险。
这还不够。有很多方法可以在其中注入Javascript。
我个人使用HTMLSanitizer library。它根据元素和属性的白名单检查HTML内容。这个列表也可以很容易地扩展,但你必须知道在这种情况下你究竟在做什么。
用法非常简单。使用Nuget安装后
你可以简单地说:
var sanitizedHtml = new HtmlSanitizer().Sanitize(<Unsatnizied_HTML_Content>);
在OWASP中也提到过你可以在这个链接中找到它:https://www.owasp.org/index.php/.NET_AntiXSS_Library