在使用 Checkmarx 扫描 ASP.net MVC 应用程序时,我经常看到堆检查漏洞。因此,我开始怀疑是否可以使用自定义模型绑定器或内置绑定器ByteArrayModelBinder
将密码和其他敏感字符串保留在堆之外,以进行受控处理。我想出了以下解决方案,它通过字节数组发布和显示敏感数据,但我想知道这些数据是否仍然通过某个地方的字符串进入堆。(注:显示动作仅用于调试。)
视图模型
public class ByteArrayViewModel
{
public byte[] SensitiveData { get; set; }
}
输入视图
@model MvcHandlingSensativeStrings.Models.ByteArrayViewModel
@{
ViewBag.Title = "byte[] Post";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>@ViewBag.Title</h2>
@using (Html.BeginForm("Post", "ByteArray", FormMethod.Post))
{
@Html.TextBoxFor(m=>m.SensitiveData);
<button type="submit">Send</button>
}
控制器
public class ByteArrayController : Controller
{
public ActionResult Index()
{
return View(new ByteArrayViewModel());
}
[HttpPost]
public ActionResult Post(ByteArrayViewModel viewModel)
{
try
{
// Handle sensitive data here
return View("Display", viewModel);
}
catch
{
return View("Index");
}
finally
{
// Clear sensitive data from memory
//Array.Clear(viewModel.SensitiveData, 0, viewModel.SensitiveData.Leng
}
}
public ActionResult Display(ByteArrayViewModel viewModel)
{
return View(viewModel);
}
}
显示视图
@model MvcHandlingSensativeStrings.Models.ByteArrayViewModel
@{
ViewBag.Title = "byte[] Display";
Layout = "~/Views/Shared/_Layout.cshtml";
string s = Convert.ToBase64String(Model.SensitiveData);
}
<h2>@ViewBag.Title</h2>
<p>@s</p>
<p>@Model.SensitiveData.GetType().ToString()</p>
显示输出
* 更新 *
这表明在执行任何其他模型绑定器之前ByteArrayModelBinder
或任何其他模型绑定器执行之前,表单参数都存储在字符串数组中,因此容易受到堆检查。
* 更新 2 *
如果您查看 Microsoft 的 NetworkCredential 实现,您会注意到即使 Password 属性是一个字符串,但 SecureString 在下面用于存储。