Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 标准Html.DisplayTextFor()是否没有Html编码?_Asp.net Mvc_Xss - Fatal编程技术网

Asp.net mvc 标准Html.DisplayTextFor()是否没有Html编码?

Asp.net mvc 标准Html.DisplayTextFor()是否没有Html编码?,asp.net-mvc,xss,Asp.net Mvc,Xss,我们目前正在处理一个ASP.NET MVC项目中的一些XSS问题。我发现了两个问题——第一个问题与我们的请求验证模式有关。攻击者现在可以利用这个安全漏洞在我们的数据库中删除一些不良内容 第二个问题是我们如何显示这些内容,我们使用Html.DisplayTextFor方法,它似乎“坏了” 只需创建一个新的MVC 3 WebApp,将其放入HomeController: public class HomeController : Controller { public ActionResul

我们目前正在处理一个ASP.NET MVC项目中的一些XSS问题。我发现了两个问题——第一个问题与我们的请求验证模式有关。攻击者现在可以利用这个安全漏洞在我们的数据库中删除一些不良内容

第二个问题是我们如何显示这些内容,我们使用Html.DisplayTextFor方法,它似乎“坏了”

只需创建一个新的MVC 3 WebApp,将其放入HomeController:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "<SCRIPT/XSS SRC=\"htpp://ha.ckers.org/css.js\">";

        User foo = new User();
        foo.Name = "<SCRIPT/XSS SRC=\"htpp://ha.ckers.org/css.js\">";

        return View(bla);
    }

    public ActionResult About()
    {
        return View();
    }
}

public class User
{
    public string Name { get; set; }
} 
公共类HomeController:控制器
{
公共行动结果索引()
{
ViewBag.Message=“”;
User foo=新用户();
foo.Name=“”;
返回视图(bla);
}
关于()的公共行动结果
{
返回视图();
}
}
公共类用户
{
公共字符串名称{get;set;}
} 
观点:

@Html.TextBoxFor(m => m.Name) <br/> ||| <-- will be encoded

@Html.Encode(ViewBag.Message)<br/> ||| <-- will be double encoded

@Model.Name <br/> ||| <-- will be encoded 

@Html.DisplayTextFor(m => m.Name) <-- no encoding
<br/> ||| 

@Html.TextBoxFor(m=>m.Name)

因此,如果您将其用于不安全的值,您必须意识到这一点,并在您的属性上使用
[DisplayFormat(HtmlEncode=true)]


编辑:看起来HtmlEncode属性实际上不是由DataAnnotationsModelMetadataProvider(和DisplayTextFor)强制执行的。

因此,如果我只想输出简单字符串,其中可能包含错误的值(并且我不想用DisplayFormat属性修饰我的所有属性),我应该只使用@Model.Name而不是DisplayTextFor?是否可以覆盖基类型(string/int/double/…)的默认行为?正确,
@Model.Name
最适合于简单情况。对于基本类型,您仍然可以显式调用
ToString()
,并指定格式或formatprovider,例如
@Model.Number.ToString(“N”)
知道为什么在使用[DisplayFormat(HtmlEncode=true)]属性时,DisplayTextFor的值仍然没有编码吗?我只是把它放在模型中的“Name”属性上。我还需要什么吗?我道歉。我查看了codeplex上的源代码,它看起来并没有完全使用HtmlEncode属性。我做了一个错误的假设——MVC和DataAnnotation库并不总是100%匹配。