Как отключить сохраненный межсайтовый скриптинг в коде, который говорит инструмент анализа checkmarx?

Я получил уязвимость ниже уровня безопасности от Checkmarx.

AlcoholTrackerWebApp/AlcoholTrackerWebApp/Controllers/HomeController.cs получает данные из базы данных для элемента ToList. Затем значение этого элемента проходит через код без должной фильтрации или кодирования и в конечном итоге отображается пользователю в методе SubmitEventRequest в строке 20 из AlcoholTrackerWebApp/AlcoholTrackerWebApp/Controllers/HomeController.cs. Это может привести к хранимой атаке Cross-Site-Scripting.

public ActionResult SubmitEventRequest()
{
    AlcoholTrackerContext db = new AlcoholTrackerContext();
    string winlogin = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
             
    var intname = winlogin.Substring(winlogin.LastIndexOf('\\') + 1);
    ViewBag.IDSID = intname;
    var name = db.WorkerInfoes.FirstOrDefault(a => a.IDSID.Equals(intname));
    ViewBag.name = name.FirstName + " " + name.LastName;
    ViewBag.WWID = name.OrgUnitDescr;
    ViewBag.ConsumptionMethod = db.AlcoholConsumptions;
    ViewBag.ConsumptionMethod = new SelectList(db.AlcoholConsumptions, "AlcoholConsumptionId", "ConsumptionMethod");
             
    return View(new Event());
}

Если я сделаю это ниже с использованием HttpUtility.HtmlEncode, то в инструменте Checkmarx не будет найдено уязвимости безопасности.

ViewBag.ConsumptionMethod =
    new SelectList(HttpUtility.HtmlEncode(db.AlcoholConsumptions), "AlcoholConsumptionId", "ConsumptionMethod");

Но с приведенным выше исправлением я получаю сообщение об ошибке в Razor View для раскрывающегося списка:

@Html.DropDownListFor(model => model.AlcoholConsumptionId,
    ViewBag.ConsumptionMethod as IEnumerable<SelectListItem>,
    "---Please Select---",
    new {
            id = "AlcoholConsumptionMethod",
            @class = "form-control-new",
            style = "margin-left:-788px;margin-top:20px;width:20.5%"
        }
)

Ошибка в представлении: DataBinding: «System.Char» не содержит свойства с именем «AlcoholConsumptionId».


person bob3409    schedule 07.08.2020    source источник


Ответы (1)


db.AlcoholConsumptions имеет тип IEnumerable, и HTML-кодирование IEnumerable не даст ожидаемого результата и не вернет IEnumerable, который принимает SelectList.

с помощью представлений Razor автоматически кодирует данные (если вы не используете Html.Raw), поэтому вы можете удалить HttpUtility.HtmlEncode, но Checkmarx увидит, что вы не выполняете вызов явным образом, поэтому вы вернуть XSS.

Либо вы кодируете HTML AlcoholConsumptionId, прежде чем добавлять его в db.AlcoholConsumptions, либо отметите этот вывод как ложный положительный результат.

person securecodeninja    schedule 08.08.2020