隐藏密码输入字段最干净的方法?

时间:2010-08-27 14:50:06

标签: asp.net security passwords

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

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

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

5 个答案:

答案 0 :(得分:2)

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

可能有数百个字段名称被POST到您的服务器。密码不是唯一敏感的字段。根据您的应用程序,可能还有其他一些事情应该得到一点尊重。

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

答案 1 :(得分:2)

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

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

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);
}

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

这样的事情能为你效劳吗?

答案 2 :(得分:0)

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

关于input type=password

的HTML5规范has this
  

具有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 = '*****';
}

答案 3 :(得分:0)

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

答案 4 :(得分:0)

一些解决方案,虽然我不确定它们有多亮:

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

2)在网站中保留一个资源文件,列出页面名称,字段ID,并对该资源文件进行异常处理程序检查(如果异常与ResourceManager相关,则可能无效)

3)按照想法2保留数据库表。存在同样的问题。