Checkmarx对代码进行了分析,并报告了以下问题。
方法
Load_Bank
在第**行从数据库中获取数据,为Where
元素。然后,这个元素的值在没有经过适当过滤或编码的情况下流经代码,并最终在methodsBank_Read
在*行SomeController.cs
. 这可以使 存储的跨站点脚本 攻击。
internal IEnumerable<BankDTO> Load_Bank()
{
using (var Container = new EBookletEntities())
{
var query = from r in Container.Gen_Bank.AsNoTracking()
where r.IsDeleted != true
select new Gen_BankDTO
{
Id = r.Id,
Name = r.Name
};
return query.ToList<BankDTO>();
}
}
以下是控制器代码
using (var bll = new BankBLL())
{
var item = bll.Load_Bank();
var model = item.Select(r => new BVM()
{
Id = r.Id,
Name = HttpUtility.HtmlEncode(r.Name)
}).ToList();
return Json(model.ToDataSourceResult(request), "application/json", System.Text.Encoding.UTF8, JsonRequestBehavior.AllowGet);
}
Checkmarx来源。
where r.IsDeleted != true
目的地:
return Json(model.ToDataSourceResult(request), "application/json", System.Text.Encoding.UTF8, JsonRequestBehavior.AllowGet);
不知道是真的存在Stored XSS问题还是Checkmarx报假?
如何解决Checkmarx的问题?
这是不可利用的,因为响应类型是 application/json
. 即使有一个有效的xss攻击的脚本标签,没有一个现代浏览器会在响应中执行一个带有 application/json
内容类型。
同时 Id
我猜是一个数字或uuid和 Name
是html编码的,你可以说这是为了深度防御,但实际上它只需要为json编码,它本身就是这样。
你可以在Checkmarx中标记为不可利用。
另外要注意的是,在GET请求中返回一个json数组仍然不被认为是好的做法,因为有一种老的攻击叫做 劫持. 然而,这在现代浏览器中已经无法利用了,所以我不会说它是脆弱的了。除了 在IE9中,不幸的是,它可能还在使用。