我目前的雇主将数据库中的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);
所以我的问题有两部分:
从技术角度来看,我是否正确地关注在这里输入的脚本?
如果是这样,是否有一种普遍接受的处理方式,允许基本的HTML格式标记,而不会将恶意代码放入页面中?
还有一条背景信息:我并不十分关注我们的商务人员恶意将坏事件插入我们的数据库或将其粘贴在网页上。我更关心那些用户是其他类型攻击的受害者。我无论如何都不是安全专家,所以我只能尽力了解风险。
答案 0 :(得分:0)
这还不够。有许多方法可以在其中注入Javascript。
我个人使用HTMLSanitizer library。 它根据元素和属性的白名单检查HTML内容。此列表也可以轻松扩展,但您必须知道在这种情况下您正在做什么。
用法非常简单。使用Nuget安装后
你可以简单地说:
var sanitizedHtml = new HtmlSanitizer().Sanitize(<Unsatnizied_HTML_Content>);
在OWASP中也提到过你可以在这个链接中找到它: https://www.owasp.org/index.php/.NET_AntiXSS_Library