表单提交失败后发送回敏感信息的安全问题

时间:2019-01-31 16:21:38

标签: c# security asp.net-core

我有一个ASP.NET Core应用程序,我必须在其中收集一些有关申请人的信息。字段之一是SSN。

我的控制器中有一个GET操作,它显示表单的字段。看起来像这样:

[HttpGet]
[Route("~/applicant/")]
public IActionResult Applicant(int id, Guid guid)
{
    var model = CreateEmptyViewModel();
    return View(model);
}

然后我在控制器中执行POST操作,以检查表单提交是否有效,并相应地继续移动或重新加载表单。

[HttpPost]
[Route("~/post-applicant")]
public IActionResult PostApplicant(MyViewModel model)
{
    if (model == null) throw new ArgumentNullException(nameof(model));

    if (ModelState.IsValid)
    {
        // code that moves on
    }
    else
    {
        TempData["Error"] = "The form is incomplete or corrections are needed.";
        return View(nameof(Applicant), model); // reloads form with fields filled out
    }
}

我的视图模型如下:

public class MyViewModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string SSN { get; set; }
}

MyViewModel中的所有属性都是必需的。如果用户决定提供SSN但不提供名字,则表单提交将失败,并将重新加载表单。

使用最近输入的敏感信息重新加载表单是否存在与安全相关的后果?有没有更好的方式来做我在做的事?

2 个答案:

答案 0 :(得分:1)

通过SSL加密您的请求和响应是很好的第一步,但这本身并不是解决方案。 HTTPS流量可以被拦截,中间人攻击是一个真正的问题,尤其是在公共wifi等不安全的网络上。除非您可以确保所有用户都在运行所有应用了安全补丁的最新最好的平台,并且始终可以直接或通过安全VPN连接到安全网络,否则您就不能像PII那样简单地清除PII,因为它是HTTPS。即便如此,仍然存在永远无法解决的零时差漏洞。

总之,您应该始终将所有敏感的PII视为神圣不可侵犯的,除非必须如此,否则切勿通过行将其转移。最初的收集就是这样一种情况,但这并不意味着它应该在出错时重新回到生产线上。让用户再次重新输入敏感信息是完全可以的,并且大多数用户倾向于理解为什么要这样做。例如,如果您在信用卡付款表格上出现错误,则您的信用卡号尚未重新填写-这将严重违反PCI。

因此,在控制器操作中,您应该执行以下操作:

ModelState.Remove("SSN");
model.SSN = null;
return View(model);

也就是说,这时可能存在更严重的PII潜在泄漏。感谢Equifax,几乎每个人的SSN都已经公开。尽管如此,最好还是考虑来回发送什么数据。

答案 1 :(得分:-1)

只要使用HTTPS,就不会产生安全隐患。

您可以做得更好的唯一方法是在后台将POST作为AJAX请求进行。那么你只需要如果有一个返回的错误信息。唯一真正的好处是更好的用户体验,因为他们不需要等待整个页面的刷新。这里有一个示例:https://stackoverflow.com/a/6960586/1202807

但是您的操作方式也很好。