Web应用程序身份验证/安全性的最佳做法(任何平台)


12

今天,我的经理向我提出了一个问题,问我关于什么是可以接受的Web表单应用程序身份验证设计的想法,特别是对于许多流行的浏览器的性质而言,“典型用户名”密码登录字段“记住密码” 。

我在想出一个我认为可以接受的答案时遇到了麻烦。鉴于Sony令人尴尬的安全漏洞,即使存储在人身上的数据敏感度较低,我也确实要小心。我们不存储社会安全号码,甚至不存储地址,但是我们存储电话号码,电子邮件地址和访客的照片。

他担心用户可以简单地在公共终端上记住密码,然后有人可以简单地跳到该终端上并以未经授权的方式开始查看或修改数据。但是,我相当确定,至少在Windows工作站上,浏览器不会跨Windows用户帐户“记住密码”。

除此之外,我正在服务器端实现一种单向密码加密(将加密的密码存储在数据库中,在服务器上加密用户提供的密码,与数据库中的加密字符串进行比较)。目前尚无合并SSL加密的计划,但这仍然是一个选择。

这种方法是否存在主要的安全缺陷?您有更好的建议吗?


存储单向加密(即哈希)密码时,请确保您使用强哈希(即非MD5)或对密码加盐(请参阅stackoverflow.com/questions/420843/…)或同时使用两者。
Jordan Reiter

请访问OWASP网站(owasp.org)。他们有很多非常有用的安全信息,包括各种协议的“备忘单”。
拉尔夫(Ralph)

这里有一些有关基于表单的网站身份验证的准则stackoverflow.com/a/477578/463478
仅限您

Answers:


13

一些高级技巧:

  1. 仅存储您需要的数据
  2. 存储敏感数据(SSN,密码,信用卡号等)时,请始终对其进行加密
  3. 传输/接收敏感数据时,始终使用SSL加密流量
  4. 如果对信息的敏感性有疑问,请对其进行加密
  5. 不信任用户输入(有人会尝试输入错误的内容)
  6. 不信任您的数据(有人可以在数据库中更改它-例如注入恶意脚本)
  7. 不要自己加密
  8. 保护托管应用程序/数据库的服务器
  9. 为了安全起见,增加最终用户的负担(密码限制,从不泄露密码,不通过电子邮件发送URL,减少会话时间等)

我对您的建议是买一本有关保护Web应用程序安全的书。单个答案/博客/文章中传递的信息太多。单独的加密主题意义重大。


使用SSL而不是自己加密的背后是什么原因?您是否考虑使用类似WS-Security的方法来进行自己的加密?设置SSL可能很麻烦。
Jefferson先生

这是一个很好的清单。我很惊讶没有更多的投票。
Kristofer Hoch

2
@ Mr.Jefferson我会说99.999999%的时间,您从不希望“自己进行加密”。
扎克·莱顿


1

我说你应该没事。

大多数用户将足够聪明,不会在公共终端上保存密码,并且密码将按配置文件存储。请记住,他们可以轻松地将其写在便笺上或使用弱密码。

如果登录页面未通过SSL加密,那么攻击者在网络上传输该密码就不会太困难。不过,很好地对数据库中的密码进行哈希处理,可以防止潜在的攻击者看到每个人的密码(他们可以将其与电子邮件地址一起使用,以尝试登录用户可能所在的其他站点。)

如果您仍然愿意,正如Chad所指出的,可以使用多种方法来禁用浏览器的行为。我自己在银行的网站和Microsoft的Live系统上都只看到过这种情况。


很棒的帖子,我忘了补充一点,尽管用户名不是电子邮件地址,但是用户将在系统中存储一个电子邮件地址。有趣的是您提到了这一点,因为即使是Facebook之类的流行网站也容易受到数据包嗅探,以获取电子邮件地址和密码。
maple_shaft

我还想补充一点,我并不是要指出Facebook中的安全漏洞是应用程序中不良的安全模型所必需的“借口”。仅仅因为Joey的妈妈让他观看额定的R电影并
不对劲

1

在某些时候,您不能(而且法律上没有要求)保护用户免受自身侵害。“记住密码”功能可能会有风险,但这是用户承担的风险。同样,如果用户决定将其密码重复用于多种服务,他们也将承担这种风险。即使用户也经常这样做,也不需要警告他们不要将密码写在便笺上并将其粘贴到监视器上。

也就是说,直到有人成功提起诉讼并更改规则。另请参阅:“警告:内容可能很热”。


0

我认为您无法可靠地控制浏览器是否记住密码。无论浏览器是否执行,它都完全在您的手中。对于来说,也不一定是巨大的安全风险。您应始终假定可以通过有效的登录名进行攻击。不要以为某人拥有有效的登录用户/通行证就不会被认为是不合格的。毕竟,有很多方法可以使密码落入不法之徒。

我想您可以做的是每次将登录表单中的字段名称随机化。而不是<input name="username"使用类似<input name="user658667587"。这样会使缓存的用户名变得毫无用处。但我不知道这些开销是否值得。且不说不便谁的用户的arent在公共机器。

如果您处于对安全性极为敏感的情况(银行,投资),则可以在登录过程中简单地询问人们是否公开的机器。您也可以在人们登录时缓存已知的IP地址,如果他们从其他位置登录,则除了普通用户/密码外,还要求输入无法键入的密码(例如,单击图像)。我的银行做了类似的事情。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.