我希望我的网站有一个用户可以点击的复选框,这样他们每次访问我的网站时都不必登录.我知道我需要在他们的计算机上存储一个cookie来实现它,但该cookie中应包含哪些内容?
此外,是否存在常见错误,需要注意保持此cookie不会出现安全漏洞,这可以避免,同时仍然提供"记住我"功能?
我看到有几个.哪些是维护和易于使用?它们的优缺点是什么?
首先,一点背景:我正在为CodeIgniter实现一个auth + auth系统并不是什么秘密,到目前为止我赢了(可以这么说).但是我遇到了一个非常重要的挑战(大多数auth库完全错过了,但我坚持正确处理它):如何智能地处理大规模,分布式,可变用户名的暴力攻击.
我知道所有常用的技巧:
现在,这些只是理论上可行的想法.有很多垃圾想法可以打开网站(比如琐碎的DoS攻击).我想要的是更好的东西.更好的是,我的意思是:
它必须安全(+)抵御DoS和暴力攻击,并且不会引入任何新的漏洞,这些漏洞可能会让稍微狡猾的机器人继续在雷达下运行
它必须是自动化的.如果需要人工操作员验证每次登录或监控可疑活动,那么它无法在真实场景中运行
它必须适用于主流网络使用(即可由非程序员执行的高流失率,高流量和开放式注册)
它不会妨碍用户体验到临时用户会感到烦恼或沮丧(并可能放弃网站)
它不能涉及小猫,除非它们真的是非常安全的小猫
(+)'安全',我的意思是至少和偏执的用户保密密码一样安全
所以 - 让我们听听吧!你会怎么做?你知道我没有提到过的最佳实践(哦,请你说)吗?我承认我对自己有所了解(结合3和4的想法),但我会让真正的专家在让自己尴尬之前说话;-)
我已经阅读了大量与此问题相关的文档,但我仍然无法将所有内容整合在一起,所以我想问几个问题.
首先,我将简要描述一下我理解的身份验证过程,因为我在这方面可能会弄错:客户端启动连接,服务器使用公钥,某些元数据和数字签名来响应信任的权威.然后客户端决定是否信任服务器,使用公钥加密一些随机会话密钥并将其发回.该会话密钥只能用存储在服务器上的私钥解密.服务器执行此操作,然后HTTPS会话开始.
那么,如果我在上面是正确的,问题是如何在这种情况下发生中间人攻击?我的意思是,即使有人用公钥拦截服务器(例如www.server.com)的响应并且有一些方法让我认为他是www.server.com,他仍然无法解密我的会话密钥没有私钥.
谈到相互认证,是关于服务器对客户身份的信心吗?我的意思是,客户端已经可以确定她正在与正确的服务器进行通信,但现在服务器想要找出客户端是谁,对吧?
最后一个问题是关于相互认证的替代方案.如果我在所描述的情况下充当客户端,如果在SSL会话建立后在HTTP头中发送登录名/密码怎么办?正如我所看到的,这些信息无法被截获,因为连接已经被保护,服务器可以依赖它进行识别.我错了吗?与相互身份验证相比,这种方法有哪些缺点(只有安全问题很重要,而不是实现复杂性)?
我刚刚阅读这篇文章关于防止快速登录尝试的基于表单的网站身份验证的权威指南.
最佳实践#1:短暂的时间延迟随着尝试失败的次数而增加,例如:
1次尝试失败=无延迟
2次尝试失败= 2秒延迟
3次尝试失败= 4秒延迟
4次尝试失败= 8秒延迟
5次尝试失败= 16秒延迟
等
DoS攻击这个方案将是非常不切实际的,但另一方面,可能具有破坏性,因为延迟会呈指数级增长.
我很好奇我如何在PHP中为我的登录系统实现这样的东西?
查看Gmail的Cookie,很容易看到存储在"记住我"cookie中的内容.用户名/一次访问令牌.在用户名是秘密的情况下,它可以以不同的方式实现.但无论如何......事情的安全性不是很高:你偷走了饼干而你已经准备好了.
我的问题是在功能方面,但是你什么时候擦拭他们的访问权限?如果用户登录而未在另一台计算机上单击"记住我",是否应该在所有计算机上使其访问权限无效?我问的是传统上如何实现它,以及它应该如何实现.
我想在登录前添加"记住我"复选框选项.
在用户的浏览器中安全存储cookie的最佳方法是什么?
例如,Facebook有"记住我"复选框,这样每次进入facebook.com时您都已登录.
我当前的登录使用简单的会话.
假设我们有一个包含敏感密码的配置文件.我想版本控制整个项目,包括配置文件,但我不想共享我的密码.
这可能是好的,如果这个配置文件:
database_password=secret
foo=bar
Run Code Online (Sandbox Code Playgroud)
变
database_password=*
foo=bar
Run Code Online (Sandbox Code Playgroud)
而且vcs的其他用户也可以自己设置密码.忽略文件不是一个好方法,开发人员应该知道,如果配置文件发生了变化.
本地版本:
database_password=own_secret
foo=bar
Run Code Online (Sandbox Code Playgroud)
vcs中的配置文件:
database_password=*
foo=bar
Run Code Online (Sandbox Code Playgroud)
然后突然,配置文件发生了变化:
database_password=*
foo=bar
baz=foo
Run Code Online (Sandbox Code Playgroud)
每个开发人员都会使用本地版本:
database_password=own_secret
foo=bar
baz=foo
Run Code Online (Sandbox Code Playgroud)
这是我的解决方案.我怎么能实现这种行为?你如何存储你的配置文件?有没有办法做到这一点,还是我应该破解什么?
我有登录页面,当然我希望防止暴力攻击,并在用户登录时减少延迟.
目前,您输入用户名和密码登录.
我正在考虑实施一个reCAPTCHA.但是,这显示在3次尝试失败后登录.
我的问题是:
你的尝试基础是什么?IP地址?它总是可以隐藏...用户名?如果他们尝试的用户不存在怎么办?
计算失败登录尝试的最佳方法是什么?
如果您要在将用户密码发送到线路之前对其进行哈希处理并将其保留为内存中的纯文本,这是否会提高应用程序的安全性?
我认为这可以通过保护存储在客户端内存中的数据来减轻一小部分漏洞.但实际上,如果我们担心有人在阅读客户的记忆,那么可能存在我们无法解决的更大问题.
在客户端有一些对哈希感觉不正确的事情.
客户端密码散列是否常见?这样做还有其他优点或缺点吗?
编辑:鉴于通信渠道是安全的(SSL).在什么条件下使用这种方法是可以接受和值得的.我问这个是因为"安全专家"建议我在某些应用程序功能中使用这样的方案.
security ×6
php ×3
remember-me ×3
brute-force ×2
cookies ×2
client-side ×1
codeigniter ×1
honeypot ×1
ssl ×1
svn ×1
throttling ×1