【发布时间】:2017-09-19 20:25:25
【问题描述】:
在使用 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 在下面用于存储。
【问题讨论】:
-
听起来您正在尝试重新发明 SecureString 类。
-
@mason,SecureString 没有内置模型绑定器,但字节数组有。
-
你真正想要完成什么?通过绑定到一个秘密,无论技术如何,问题都无关紧要。
-
您的更新与我的回复一致! RequestObjects 将它们的元素存储在一个字符串数组中。你会把创可贴放在筛子上吗?
-
我不是故意的,但我只是想指出,如果你通过 ASP.net 堆栈传递秘密,那么“我如何将秘密从我的堆中取出”这个问题是无关紧要的,剃须刀之类的。这与 SecureString 无关。 SecureString 没有模型绑定器,因为这会使 SecureString 的(已经有限的)安全性失效。
标签: c# asp.net-mvc security model-binding checkmarx