2010-08-27 82 views
3

我们有一些错误报告代码,当发生未处理的异常时,我们会通过电子邮件将所有内容发送给我们的组。除非在带有密码字段的页面上发生未处理的异常,否则它将以纯文本形式发送。最干净的方式来隐藏密码输入字段?

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

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

+1

您可以在名称中查找带有“密码”的项目。不完全是最干净的方式。 – Jerome 2010-08-27 14:53:47

+0

你能加密所有密码吗? – Kyle 2010-08-27 15:01:22

+0

我们有数百个遗留页面,并不是所有的名称都有密码。 Kyle,我不确定你在暗示什么。您是否要在发布到Web服务器之前加密客户端的密码?加密是一个双向的街道,我不觉得舒服的发送电子邮件... – Kris 2010-08-27 15:14:36

回答

2

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

可能有数百个字段名称被发送到您的服务器。密码不是唯一敏感的字段。根据您的应用程序,可能会有其他一些事情需要谨慎对待。

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

+0

这似乎是唯一的方法来解决这个=/ 我希望有一种方法来确定后面的代码中的输入类型。 – Kris 2010-08-27 15:24:27

+1

@Kris - 你不能。该字段的类型不会发送到HTTP请求中的服务器。它是一个黑名单(不要发送密码或密码或PASSWORD);或白名单(只发送UserID和ProjectID和SomeOtherProjectSpecificID)...我个人更喜欢白名单,因为它更安全。 – 2010-08-27 15:34:51

0

最简洁的方法是检查输入元素的type属性。

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

与一种类型的属性的值是“口令”表示用于输入密码的一个行纯文本编辑控制输入元件。

数据类型:文本没有换行符(敏感信息)
控制类型:该遮蔽数据输入

这是来自所有用户代理implmentations强制性要求文本字段,和它自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 = '*****'; 
} 
+0

呃,我知道输入类型是密码。你究竟可以在ASP.Net中检查这个问题是我所问的。据我所知你不能访问输入元素,除非他们有一个runat =服务器设置,我不能保证每个使用这个逻辑的页面都这样做。 – Kris 2010-08-27 15:13:14

+0

我看到了你的编辑。不确定如何将它们隐藏在客户端会有所帮助;除非您通过AJAX发送,否则您永远不会在后端收到密码。 – Kris 2010-08-27 15:16:49

+0

糟糕,我在上面编辑了我的答案,并在添加评论的同时添加了一个示例,说明如何在客户端执行此操作。 除非您使用某种类型的HTTP通道安全性(如HTTPS),否则密码将始终以未加密方式发送,无论您是否有错误。 我误解了什么吗? – 2010-08-27 15:17:50

0

由于Jerome already pointed out in the comments,只是保持你的密码的名称轨道输入字段并在发送错误/例外报告之前对其进行过滤。由于未提交输入字段的类型,因此这是最佳解决方案。

0

一些解决方案,但我不知道怎么亮他们中任何一个:

1)在页面维护是密码输入控件ID列表,通过这个列表与异常处理程序期望忽略这些领域。

2)请列出页面名称,一个字段id网站的资源文件,并有此资源文件中的异常处理程序检查,如果该异常相关的ResourceManager(可能无法正常工作)

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

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

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

可以这样的工作吗?

+0

这很聪明。你是对的,不是优雅而是有趣的。不幸的是,它不适用于我们的许多遗留页面,但非常漂亮。 – Kris 2010-08-27 15:46:22