【问题标题】:Cleanest way to hide password input fields?隐藏密码输入字段的最简洁方法?
【发布时间】:2011-04-04 20:42:39
【问题描述】:

我们有一些错误报告代码,当发生未处理的异常时,我们会将所有内容通过电子邮件发送给我们的小组。这很好,除非在带有密码字段的页面上发生未处理的异常,然后将其作为纯文本发送。

有没有办法遍历 Request.Form 并找出哪些项目是密码?这是在低级别完成的,因此我们无法寻找特定的控件。

当然,我们可以检查输入框的类型,但我不确定这是否是最干净的方式。建议?

【问题讨论】:

  • 您可以查找名称中带有“密码”的项目。也不是最干净的方式。
  • 你能加密所有密码吗?
  • 我们有数百个旧页面,但并非所有页面的名称中都有密码。凯尔,我不确定你在暗示什么。您是说在发布到 Web 服务器之前在客户端加密密码吗?加密是一条双向的道路,我不喜欢通过电子邮件发送...
  • 这似乎是解决这个问题的唯一方法 =/ 我希望有一种方法可以在后面的代码中确定输入类型。

标签: asp.net security passwords


【解决方案1】:

使用您要通过电子邮件发送的字段名称白名单。

可能有数百个字段名称会发布到您的服务器。密码不是唯一敏感的字段。根据您的应用程序,可能还有其他需要尊重的事情。

因此,请列出有助于调试的字段名称。这些通常是唯一标识符/数据库键等。如果您在此列表中有任何参数名称,您可以将其包含在电子邮件中。

【讨论】:

  • 这似乎是解决这个问题的唯一方法 =/ 我希望有一种方法可以在后面的代码中确定输入类型。
  • @Kris - 你不能。字段的类型不会在 HTTP 请求中发送到服务器。它要么是黑名单(不要发送密码或密码或密码);或白名单(仅发送 UserID 和 ProjectID 和 SomeOtherProjectSpecificID)...我个人更喜欢白名单,因为它更安全。
【解决方案2】:

我之前提出了一个不同的解决方案,但我认为您将在客户端处理这个问题。跟随你的 cmets,我现在明白你需要在服务器端处理这个问题。您可能有一种方法可以做到这一点,这不是很优雅,但应该可以:

向所有页面添加一个脚本,该脚本将所有密码字段名称收集到一个新的客户端生成字段中,如下所示:

function collectPasswordFields() {
    var inputs = document.getElementsByTagName('input'), list = [];
    for (var i = 0; i < inputs.length; ++i)
        if (inputs[i].type == 'password') list.push(inputs[i].name);
    var field = document.createElement('input');
    field.name = '__password_fields';
    field.value = list.join(',');
    document.getElementsByTagName('form')[0].appendChild(field);
}

然后拦截服务器端错误处理程序中的附加字段,并从电子邮件中删除命名字段。

这样的东西对你有用吗?

【讨论】:

  • 这很聪明。你说得对,不优雅但有趣。不幸的是,它不适用于我们的许多旧页面,但非常漂亮。
【解决方案3】:

最干净的方法是检查输入元素的type 属性。

HTML5 规范has this 说一下input type=password

type属性值为“password”的input元素代表一个用于输入密码的单行纯文本编辑控件。

数据类型:没有换行符的文本(敏感信息)
控件类型:隐藏数据输入的文本字段

这是所有用户代理实现的强制性要求,自 HTML 2 以来一直如此。所以这确实是做你想做的最干净的方法。

如果你想在客户端做(你谈到将数据发送到服务器)那么它相对容易:

function hidePasswords() {
    var inputs = document.getElementsByTagName('input');
    for (var i = 0; i < inputs.length; ++i)
        if (inputs[i].type == 'password') input[i].value = '*****';
}

【讨论】:

  • 呃,我知道输入类型是密码。我要问的是,究竟如何在 ASP.Net 中进行检查。据我所知,您无法访问输入元素,除非它们设置了 runat=server 并且我不能保证使用此逻辑的每个页面都这样做。
  • 我看到了你的编辑。不太确定将它们隐藏在客户端会有什么帮助;除非您通过 AJAX 发送密码,否则您永远不会在后端收到密码。
  • 糟糕,我在上面编辑了我的答案并添加了一个示例,如何在您添加评论的同时在客户端执行此操作。除非您使用某种 HTTP 通道安全性,例如 HTTPS,否则无论您是否有错误,密码都将始终未加密地发送。我是不是误会了什么?
  • 如果可以在客户端检测到错误情况,那么可以在提交时调用密码隐藏函数,然后进行提交。
  • 是的。我们有通过电子邮件发送所有 Request.Form 值的错误处理,但如果在带有密码字段的页面上发生意外错误,我们会无意中通过电子邮件以明文形式发送密码。我正在寻找一种方法来隐藏所有输入类型密码的值,但我看不到这样做的方法。由于数百个遗留页面都在使用它,我无法返回并更新所有这些页面以使用 或实际的密码控件,所以我试图弄清楚看看是否有另一种方法可以确定在 ASP.Net 中输入的密码是什么。
【解决方案4】:

作为Jerome already pointed out in the comments,只需跟踪密码输入字段的名称并在发送错误/异常报告之前过滤它们。这是最好的解决方案,因为输入字段的类型没有提交。

【讨论】:

    【解决方案5】:

    一些解决方案,虽然我不确定它们中的任何一个有多亮:

    1) 在页面中维护一个作为密码的输入控件 ID 的列表,将此列表传递给异常处理程序以忽略这些字段。

    2) 在网站中保留一个资源文件,其中列出页面名称、字段 ID 并让异常处理程序检查此资源文件(如果异常与 ResourceManager 相关,则可能不起作用)

    3) 和想法2一样保留一个数据库表。存在同样的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-27
      • 2011-12-06
      • 2013-08-19
      • 2023-03-08
      • 2012-03-01
      相关资源
      最近更新 更多