用户身份验证最佳做法清单

用户身份验证是每个Web应用程序共享的功能。 我们已经实现了很多次,所以很早以前就应该完善它。 然而,错误无时无刻不在发生。

造成这种情况的部分原因是,可能出问题的清单很长。 您可能会错误地存储密码,可能会具有脆弱的密码重置功能,可能使会话遭受CSRF攻击,会话可能被劫持,等等。因此,我将尝试汇编有关用户身份验证的最佳做法列表。 每年, OWASP TOP 10总是您应该阅读的内容。 但这可能还不够。

所以,让我们开始吧。 我会尽量简明扼要,但我会尽可能涵盖所有相关的陷阱-例如,用户会话登录后可能出什么问题:

  • 使用bcrypt / scrypt / PBKDF2存储密码。 没有MD5或SHA,因为它们不利于密码存储。 长盐(每位用户)是强制性的(上述算法已内置)。 如果您不这样做,并且有人控制了您的数据库,那么他们将能够提取所有用户的密码。 然后在其他网站上尝试这些密码。
  • 使用HTTPS。 期。 (否则,用户凭据可能会通过不受保护的网络泄漏)。 如果用户打开纯文本版本,则强制使用HTTPS。 并确保仅使用最新的协议(目前使用TLS 1.2; TLS 1.1似乎没有漏洞,因此也可以受支持)。 您可以进行Qualys扫描以检查支持的协议版本是否正确。
  • 将Cookie标记为secure 。 使饼干盗窃更加困难。
  • 使用CSRF保护(例如,随每个请求验证的CSRF一次性令牌)。 框架具有内置的此类功能。
  • 禁止取景( X-Frame-Options: DENY )。 否则,您的网站可能会以隐藏的iframe包含在另一个网站中,并通过javascript被“滥用”。
  • 有一个同源政策
  • 注销–通过删除所有cookie并使会话无效,让您的用户注销。 这样可以更安全地使用共享计算机(是的,用户最好使用私有浏览会话,但并非所有人都那么聪明)
  • 会话期满–没有永久的会话。 如果用户关闭您的网站,则其会话应在一段时间后到期。 取决于提供的服务,“一会儿”可能仍然是很大的数字。 对于ajax繁重的网站,您可以进行常规的ajax轮询,以在页面保持打开状态时使会话保持活动状态。
  • 记住我-由于永久性cookie被盗的风险,(在这台机器上)实现“记住我”功能实际上很困难。 Spring-security使用这种方法 ,如果您想实现更持久的登录,我认为应该遵循。
  • 忘记密码流–忘记密码流应依赖于向用户发送一次(或到期)链接,并在打开密码时要求输入新密码。 0Auth在这篇文章中对此进行了解释 ,邮戳给了一些最好的事实 。 如何形成链接是一个单独的讨论,有几种方法。 将密码重置令牌存储在用户配置文件表中,然后将其作为参数发送到链接中。 或者不要在数据库中存储任何内容,而是发送一些参数: userId:expiresTimestamp:hmac(userId+expiresTimestamp) 。 这样,您将拥有过期的链接(而不是一次性链接)。 HMAC依赖于秘密密钥,因此不能欺骗链接。 但是,由于OWASP指南的方法略有不同 ,因此在该主题上似乎尚未达成共识
  • 一次性登录链接–这是Slack使用的选项,它发送一次性登录链接,而不是询问用户密码。 这取决于您的电子邮件受到严格保护,并且您始终可以访问它。 如果不经常访问您的服务,则可以使用该方法代替密码(而不是除密码之外)。
  • 限制登录尝试–无法通过Web UI进行暴力破解; 因此,如果登录尝试次数过多,则应将其阻止。 一种方法是仅基于IP阻止它们。 另一个是根据尝试的帐户阻止它们。 ( 这里是Spring示例 )。 哪一个更好-我不知道。 两者实际上可以合并。 除了完全阻止尝试之外,您还可以在第5次尝试后添加验证码。 但是,请勿在首次尝试时添加验证码-这是糟糕的用户体验。
  • 不要通过错误消息泄漏信息–您不应该允许攻击者弄清楚是否已注册电子邮件。 如果未找到电子邮件,则登录后仅报告“凭据不正确”。 重置密码时,可能类似于“如果已注册电子邮件,您应该已经收到了重置密码电子邮件”。 这通常与可用性不符–人们通常不记得他们过去用来注册的电子邮件,因此在进入之前检查大量电子邮件的能力可能很重要。 因此,此规则不是绝对的,尽管它是理想的,尤其是对于更关键的系统。
  • 确保仅在确实必要时才使用JWT,并要注意一些陷阱。
  • 考虑使用第三方身份验证-OpenID Connect,Google / Facebook / Twitter的OAuth (但也要注意OAuth的缺陷 )。 依靠第三方身份提供者存在相关风险,您仍然必须管理cookie,注销等,但是简化了某些身份验证方面。
  • 对于高风险或敏感应用程序,请使用2因子身份验证 。 不过,Google身份验证器有一个警告-如果您丢失了手机,就会丢失帐户(除非有手动过程来恢复它)。 这就是为什么Authy似乎是存储2FA密钥的好解决方案。

我确定我想念什么。 您会发现它很复杂。 遗憾的是,我们仍然处在最常见的功能-验证用户身份-如此棘手和繁琐的状态,以至于您几乎总是会误解至少其中一些错误。

翻译自: https://www.javacodegeeks.com/2018/04/user-authentication-best-practices-checklist.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab二元一次方程求解_高中化学二元混合物的十字交叉法解法

“十字交叉法”是高中化学计算题中巧解二元混合物问题的一种常用的有效方法,正确运用“十字交叉法”,可以帮助同学们方便、迅速地解决计算问题。速解的前提:1、必须清楚“十字交叉法”运用后的比例比系——“看分母”法则。即特性数值的分母所…

Loadruner压数据库oracle,LoadRunner连接Oracle数据库(转)

51Testing软件测试网0U#~*o\*l这个是在51上转载的。。e $b#v.m051Testing软件测试网"HyG#r%f;sv7[8yr-S$_zOt }Hs0多谢楼主的奉献。。。D_2c#Sb~p.y9\08\WHR\I0#include51Testing软件测试网H(zk/dI1QawtBstatic LRD_INIT_INFO InitInfo{LRD_INIT_INFO_EYECAT};51Testing软…

python怎么输入两行_python交互模式下输入换行/输入多行命令的方法

先给大家介绍下python交互模式下输入换行/输入多行命令的方法 换行方法 \ 如: >>> print aaa; \ ... print bbb; \ ... print ccc 注意;号的使用。 python本身语句结束和间隔都是不需要;号的,但是在换行时要使用;号&…

linux系统读取excel文件是否存在,小弟我用poi读excel,在window下没有有关问题,但把程序放到linux上时,读取客户端的excel文件报错,不...

我用poi读excel,在window下没有问题,但把程序放到linux上时,读取客户端的excel文件报错,不知道如何解决我用poi读excel,在window下没有问题,但把程序放到linux上时,读取客户端的excel文件报错&a…

利用python计算圆球的体积_python计算圆周长、面积、球体体积并画出圆

#https://github.com/RobberPhex/GTK-Example-CalcArea from gi.repository import Gtk, Gdk, GdkPixbuf from PIL import Image, ImageDraw from io import BytesIO from math import pi class Model:模型类 存储半径,计算周长、面积、体积def __init__(self): sel…

可重入锁 不可重入锁_什么是可重入锁?

可重入锁 不可重入锁在Java 5.0中,增加了一个新功能以增强内部锁定功能,称为可重入锁定。 在此之前,“同步”和“易失性”是实现并发的手段。 public synchronized void doAtomicTransfer(){//enter synchronized block , acquire lock over…

pythonista3安卓_Pythonista 3 app下载

Pythonista 3介绍 Pythonista is a complete scripting environment for Python, running directly on your iPadiPhone. It includes support for both Python 3.62.7, so you can use all the language improvements in Python 3, while still having 2.7 avAIlable for back…

linux查看本机所有预设的系统变量,如何设置与查看Linux系统中的环境变量?

大家都知道,在 Linux 系统中,有环境变量和 Shell 变量这两种变量。环境变量是在程序及其子程序中全局可用的,常常用来储存像默认的文本编辑器或者浏览器,以及可执行文件的路径等等这样的信息。而 Shell 变量仅在当前 Shell 中可用…

使用Amazon s3托管您的Maven工件

如果您使用Amazon Web Services并将Java用于项目,则Amazon S3是托管团队工件的理想场所。 它很容易设置,而且很便宜。 如果您对它们的功能不特别感兴趣,那么它比设置现有存储库选项(jfrog,nexus,archiva等…

linux kill进程后黑屏,Linux中Kill进程的N种方法

常规篇:首先,用ps查看进程,方法如下:$ ps -ef……smx 1822 1 0 11:38 ? 00:00:49 gnome-terminalsmx 1823 1822 0 11:38 ? 00:00:00 gnome-pty-helpersmx 1824 1822 0 11:38 pts/0 …

ffmpeg宏块(Macroblock)概念

参考文章:音视频高手课系列5-h264编码基础(宏块原理) 文章目录 使用videoEye分析视频宏块示例FFmpeg宏块概念1. 宏块的定义2. 宏块的分类I-MacroblocksP-MacroblocksB-Macroblocks 3. 宏块的编码过程1. 运动估计2. 变换与量化3. 熵编码 4. 宏块的解码过程1. 熵解码2…

python123循环结构_来学Python啦,大话循环结构~

点击上方蓝字关注"程序员Bob"每日一句,送给最珍贵的你: 为学日益,为道日损,损之又损,以至于无为,无为而无不为。最近想研究爬虫了,准备拾起以前Python,继续学!…

linux查看主机脚本,简单的bash脚本查看任意网段的在线主机

一前言最近看到许多同志在写ping某个地址段的bash脚本,我也心血来潮来了一发。 当然本人新手,大神勿喷。二准备工作linux系统的机器一台,当然虚拟机也可以,只要将网卡配置为桥接模式,可以连通其他局域网的主机即可。1…

python求一组数的最大值_python快速求一个数组的最大值/最小值及其索引

enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标。 x [3, 2.2, 7.4, 6, 4] list(enumerate(x)) # 输出 [(0, 3), (1, 2.2), (2, 7.4), (3, 6), (4, 4)] operator.itemgetter()函数用于获取对象的哪些维…

linux远程调用的脚本在ssh时报错,linux:ssh远程调用tomcat脚本时候出错

执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二)前言 文章 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 中,已经完成对 gulp 的安装,由于是window环境,文中特意提到了可以通过安装 gitbash 来代替 ...定制Eclipse IDE之插件篇(二)上…

python中什么叫合法的标识_python合法标识符要求是什么

python合法标识符要求是:1、不能以数字开头;2、不能包含非法字符;3、数字不能作为标识符;4、不能包含空格;5、不能包含运算符。1.不能以数字开头>>> 2bin2 File "", line 1 2bin2 ^ SyntaxError: i…

hibernate状态_Hibernate状态的自然身份证

hibernate状态自然ID是可以唯一标识实体的一个或一组属性。 我们最多可以为一个实体定义一个自然ID。 当Hibernate在实体映射文件中看到natural-id标记时,它会自动在构成natural-id的属性上创建唯一且非空的约束。 首先,让我们看一下简单和复合自然ID的示…

android界面实现框架内页面跳转_KVM虚拟化管理平台的实现

KVM虚拟化管理平台的实现源码链接:https://github.com/wsjhk/IaaS_admin.git视频演示链接:https://v.youku.com/v_show/id_XMjg4MTczODU1Ng.html(N年前刚开始学习Python时做的第一个自主设计实现项目,代码实在写的烂,不喜勿喷&…

suse linux 查看内存,Suse linux查询内存大小的指令是什么?

满意答案CJTHI2013.08.18采纳率:49% 等级:12已帮助:5850人下面和大家分享在Linux系统下查看内存使用情况的free命令:[rootscs-2 tmp]# freetotal used free shared buffers cachedMem: 3266180 3250004 16176 0 110652 2668236…

Java 8中的并行和异步编程

并行代码是在多个线程上运行的代码,曾经是许多经验丰富的开发人员的噩梦,但是Java 8带来了许多更改,这些更改应该使这种提高性能的技巧更加易于管理。 并行流 在Java 8之前,并行(或并发)代码与顺序代码之间…