安全的Web登录示例/教程

时间:2011-05-26 09:59:26

标签: security language-agnostic login

有很多方法可以为网络应用创建一个登录表单,其中大多数都是有缺陷的:

  • 密码以明文形式传输/保存
  • 登录对话框受XSS攻击或SQL注入

是否有示例或教程如何创建安全登录表单?

2 个答案:

答案 0 :(得分:8)

我同意卡洛斯关于缺乏“完美”安全系统的信息,不仅用于登录,还用于任何其他组件。唯一要做的就是通过遵循最佳实践来最大限度地降低风险,但始终牢记总安全性不存在,所以你的问题很难回答,尽管有一些很好的例子there没有什么是完美,安全是一个非常快速发展的话题。

对我来说,要解决的主要问题是:

- 数据传输:用户始终要输入密码,这必须在处理之前发送到您的系统,因此如果您使用的话,很有可能会被截获一个开放的渠道。要解决此问题,您必须使用通过加密通道(SSL)传输数据,除非您删除公共密码(例如使用一次性使用令牌,或将身份验证委派给第三方,如Facebook connect或openId) )。见"How to Make a Secure Login Form with SSL"

- 输入卫生:为避免XSS和SQL注入将来自客户端的任何输入视为潜在风险点,因此您必须对来自外部的任何内容执行验证 - > doc。另一个good practice永远不会直接在查询上使用输入,在预准备语句或存储过程中用作绑定变量。

- 密码存储:密码应始终使用单向散列算法加密存储,因此即使有人访问您的数据库,也无法恢复原始密码。还要使用Salting,Hashing等多种技术......另外要注意选择一种不弱或过时的算法(如MD5),这可以通过增加CPU功率轻易打破。

- 基础设施:让您的机器,操作系统,框架,库始终更新以避免错误和0天攻击。今天的任何系统都非常复杂,系统和最弱的组件一样安全。

- 其他需要考虑的事项:定期检查您的安全策略,看看是否需要更新任何内容,实施密码策略(过期,重用等),日志访问,使用监控工具你的系统等等

毕竟,你仍然可以确定如果有人有足够的时间和资源,你的系统就会崩溃。

答案 1 :(得分:3)

你的问题,不能是那种不可知论者,必须分为两个主要问题:

以明文形式传输密码。 Xss,Sql注入。

本身不会宣布任何系统安全,但您可以通过使用经过验证的概念尽力将风险降至最低。

所以,假设你有机会设计自己的“安全系统”,你需要什么?

至少你需要一套基本的工具:

Client side data encripting: (Javascript here, i think you will find lots of info of how to send your data in data 64 or something like that, remember you are searching for one way or two way encription)

DB Encription: (One way-two way encription, but never save passwords in the clear)

SQl injection: (mysql_real_escape_string() comes to mind).

每种语言都内置了某种保护,在构建大型项目时,有时我们可能会忘记清理一些查询

我重申,系统永远不会被声明为安全,但您可以添加一些其他安全措施,如:

  • access_tokens =允许验证用户登录的timed-strings。
  • captcha_after_few_intents =你应该加上这个。
  • block_account_after_few_trys =用户对 * 的痛苦,但绝对值得。
  • login_token =存储该用户唯一的令牌,并在所有GET / POST交易中使用
  • SSL

来自银行保安:

  • 生成RANDS和access_tokens的自动gsm设备仅在短时间内有效。
  • 鼠标键盘:唤醒键盘记录器
  • random_access_question:
  • check_random_account_country_change =让我们说用户来自奥尔巴尼,第二天他从南美登录,这应该会为你的系统举起一面旗帜。

我相信你会在某个地方找到很多建议,但记住你最后会说html和一些js,你的主要防御是在服务器端,所以要好,或者擅长它。