首先,让我们在这里定义"最佳"。解决这个问题的"最佳"登录设计/流程/算法/技术应该是:
- 简单
。我认为我不需要解释为什么一个简单的系统比一个复杂的系统好。例如,在我看来,OAuth 2是一个非常复杂的系统。如果我没记错的话,它定义了不少于9个不同的流,用于授予应用程序对个人数据的访问权。我觉得这是多余的,但这是没有争议的。
语言无关。请不要通过给出实现来回答。我不想要实现。我想要一个(或几个……)设计。您可以给出示例,但您提出的解决方案应该易于在任何(阅读:大多数)语言中编码,而不需要针对不存在的功能进行重大的变通。
安全。该设计应涵盖网络上最常见的安全问题。XSS, CSRF,等等。我认为一个好的集合可以通过code Horror和搜索"security"获得…
现在是一些较小的细节:
- 允许
JavaScript。如果设计可以退回到无脚本环境,那就太好了。
Flash、Java小程序不允许。这违背了上面的语言不可知条款:如果你的设计需要一些只能通过Flash或Java获得的东西,这是一个缺陷。
密码存储。有一大堆与密码存储有关的问题。我不想听。
密码传输。这个 很重要。以明文形式传输密码是非常邪恶的。通过SSL,它可能是可以接受的,但如果您可以拥有一个(相对)安全的系统,而不依赖于端到端加密,那将是非常棒的。
考虑到这一切,提出你认为符合上述条件的"最佳"用户/登录/注销设计/流程/算法/技术。或者告诉我你是否认为这是徒劳的!div;)
>我想你已经考虑过这个问题了。看待解决方案的最简单方法是将其分成不同的层次。
<1)数据库/strong>
- 防止sql注入。只使用准备好的语句。最好最安全!
- 始终,我的意思是始终,确保db用户只有访问权限,它需要
2)应用
- 使用HTTPS。甚至不要尝试使用其他任何东西
- 不要在cookie或任何东西中存储用户id。如果必须,请使用会话
- 如果你没有会话,生成一个随机id使用它来查找用户。不要让cookie id不可预测,这很重要。
3) HTML/Javascript
- 通过令牌系统防止CSRF。这是唯一合法的方式
- 转义所有用户输入并在写入流之前对其进行清理。在JSP中,例如
<c:out/>
应该使用 不要在javascript中做任何安全的事情。这是一个显而易见的答案,但有时提醒一下是很好的。
4)等
- 保持补丁更新
- 不要重新创造轮子。在Rails中,已经有一些优秀的授权宝石。使用它们!
我认为在所有这些中,使用SSL是最重要的。您可以创建最复杂的系统,使用令人敬畏的加密算法进行双重提交。但是,尽管如此,最终您仍然不会得到一个比SSL更安全、经过更好测试的系统。
有趣的问题
我会考虑:
- 当需要我认为网页内容应该是公开的。所以,作为用户,我认为最好只在需要时才登录
- SSO我们应该有更容易交叉连接web应用程序的机制。我知道应用程序不以同样的方式实现权限,我们不能在那里疯狂。这就是OAuth填补空白的地方。
- 不要使用验证码(它被认为是不可访问的)。除非你使用类似的东西,比如这些
- csrf隐藏字段以确保提交的表单是有效的,而不是随机发布到端点
- 总是使用SSL大家伙正在做它,它是不安全的,让我们的用户发送他们的密码在明文。有人证明了这一点。
- 始终计划不使用javascript以防万一,无论如何,这不是因为我们可以这样做,所以这样做是好的。
相关内容
- 什么是第三方登录后端流程?
- 更改Liferay登录页面中"OpenId Connect"链接的最佳方法是什么?
- 当我在仪表板上打开网站时,这很好,但是以管理员身份登录时会出现HTTP错误500,可能是什么问题?
- 在不登录的情况下识别移动用户的好方法是什么?
- 实现用户注册和登录最常用的方式是什么?
- 将社交登录(使用 Google 登录)添加到现有电子邮件/密码应用和数据库的最佳方法是什么?
- 限制用户设备登录网站的最好方法是什么?
- 登录新的 Ubuntu 22.04 LTS 实例的默认用户名是什么?(从 AMI 创建的 AWS EC2)
- 使用IS4登录屏幕的优势是什么?
- 在iOS应用中退出和重新登录谷歌的最佳方式是什么?
- 发布后返回上一页的最佳方式是什么?(未登录)
- 如果我使用facebook/google帐户凭据登录到某些网站-那么OAuth授权类型是什么类型? &
- 限制认证用户登录页面的最佳方式是什么?
- 2021年外部提供商登录的正确方法是什么?
- 在web框架中实现Azure AD B2C注册/登录后的过程是什么?
- 在反应 js 中'$'登录的含义是什么
- 允许公共和政府 Azure SSO 登录我们的网站,同时在同意屏幕上将我们的应用标记为已验证的正确方法是什么?
- 当用户在Linux和C++中使用shadow进行身份验证时,在系统中存储身份验证(登录)的最佳方式是什么
- 什么时候在Django中使用OAuth?它在Django登录框架中的确切作用是什么
- 在登录记录器中,以下内容是什么意思?
最新更新
- 绘制函数CustomPaint和PictureRecorder以不同的大小工作
- docker 无法连接到 docker 守护程序,但已创建套接字
- 无法解析Java程序中的@param注释
- 在互斥锁上使用多个std::unique_lock,所有线程在FIFO等待进程?
- Command error out with exit status 1: python setup.py egg_in
- 当NPM应用在子文件夹中时,NPM版本命令不创建git标签
- Prometheus导出器的正则表达式模式
- Lua代码构建具有重复功能的堡垒之夜问题
- JsonPath - Restrict To Research to One level
- 将列表的列表转换为映射列表
- CVXPY二次规划- ArpackNoConvergence error and AssertionError
- Xamarin Binding表达式中的格式文本
- 我需要调用两个api在Reactjs
- 库未加载:/opt/homebrew/opt/fmt/lib/libfmt.9.dylib
- (NestJS, TypeORM) Javascript承诺:在此之前调用Finally块
- Kusto -帮助编写KQL Pivot
- Python tkinter滚动条:是否可以通过单击arrow1或arrow2来设置要移动的像素数?
- 避免在Rails#where中绑定变量
- 复制、修改和发送请求POST Fiddler
- 调用一个获取并返回字符串的用户方法,就像在c#中调用.net中的大多数字符串类方法一样
- Configure ForwardHeadersMiddleware from appsettings?
- count(1)和postgres中不同的行为
- 如何为Vue中动态生成的一个元素设置不同的样式
- 计算SQL Oracle中的百分比
- 如何打开没有Adobe动画的FLA文件?
- 一个Android模块如何知道另一个模块,而不声明它作为依赖?
- Selenium日志隐藏在python中
- 实现客户端流到服务器Python代码失败
- DllNotFoundException: agoraSdkCWrapper with Agora in Unity o
- Rust narray:按列顺序遍历数组
热门标签:
javascript python java c# php android html jquery c++ css ios sql mysql arrays asp.net json python-3.x ruby-on-rails .net sql-server django objective-c excel regex ruby linux ajax iphone xml vba spring asp.net-mvc database wordpress string postgresql wpf windows xcode bash git oracle list vb.net multithreading eclipse algorithm macos powershell visual-studio image forms numpy scala function api selenium