我不知道我是否正确行事。
我第一次建立一些东西来阻止对页面的攻击
我将从底部开始:
我有财产:
public string Description {get;set;}
用户可以通过tinyMCE
设置它的值tinyMCE.init({
mode: "textareas",
theme: "advanced",
encoding : "xml"...
在我将其保存在数据库之前的控制器中我做了:
model.Description = HttpUtility.HtmlDecode(model.Description);
在数据库中,我有一个像:
的值<p>bla bla bla</p>
我在我的项目中添加了AntiXSS库:
public class AntiXssEncoder : HttpEncoder
{
public AntiXssEncoder() { }
protected override void HtmlEncode(string value, TextWriter output)
{
output.Write(Encoder.HtmlEncode(value)); // on breakpoint code always get in here
}
...
当我从数据库显示数据时,我使用:
@Html.Raw(Model.Place.Description)
它工作正常我只看到文字。没有Html标签。 Breaklines工作正常。我可以用粗体,斜体等方式设置文本样式。
但如果我进入:
<script>alert(open to attack);</script>
我有警报窗口。我不明白我是否需要做更多的事情来防止这种情况发生?
答案 0 :(得分:5)
我将AntiXSS库添加到我的项目
你在哪里使用它?
确保您不仅添加了AntiXSS,而且还实际使用了它:
@Html.Raw(Microsoft.Security.Application.Sanitizer.GetSafeHtmlFragment(Model.Place.Description))
但请记住,AntiXSS库的新版本有点过于严格,会删除<strong>
和<br>
之类的标签,这可能是不合适的。
作为AntiXSS库的替代方案,您可以使用HTML Agility Pack来完成这项工作。 Rick Strahl blogged about a sample implementation
。
答案 1 :(得分:1)
首先,您正在显示RAW Html-未以任何方式编码。 如果你想显示Html,理想情况下你应该做几件事。
使用GetSafeHtmlFragment使用antixss Sanitizer类对其进行消毒。 请注意,这不会完全保护你。 在保存到数据库之前执行此操作。
实现尚未完全支持的标头以防止其他脚本运行。这仅限于一些现代浏览器。
或者......不允许html或不允许任何已知字符标记之外的HTML。即白名单方法,因此您允许<strong>
,并且不允许在其他字母数字字符之外进行任何操作。