许多可能的方法之一可能是:
注意:我已经用纯 PHP 对其进行了编码。但是所有语言的逻辑都是相同的。
- 设置 $redirect = FALSE。
- $_GET["logout"] 设置了吗?是,转3,否则转5
- 如果设置,删除,auth,rem_me cookies,销毁会话。
- 显示登录表单并退出。
- 这是发帖请求吗?如果是,转6,否则转18
- 设置 $redirect = TRUE。
- 是否提供了用户名和密码?是,转8,否则转3
- 从 db 获取 $username、$pass-hash 和 $rem-me-hash。
- $username & $password 和 DB 一样吗?是,转10,否则转3
- 设置 cookie["username"] = sanitized($_POST["username"])
- 发出一个包含 $auth = sha1(username.password.time.6random_letters) 的 cookie["auth"]。
- 设置会话["auth"] = sha1($auth)。取消设置 $auth。
- 是否选择了记住我选项?是,转13,否则转15
- 设置 $rem = sha1($user_string.$time.$password.$username.$random)
- 设置 cookie["rem"] = $rem
- 设置 $rem = 0
- 如果 $rem != $rem-me-hash_DB,则在 DB 中插入 $rem。前往 23
- $rem cookie 设置了吗?是的转到 19,否则转到 20
- $rem cookie == $rem-hash-in-db 吗?如果是,转至 22,否则转至 3
- $username-cookie && $auth-cookie &&auth-SESSION 设置了吗?如果是,转21,否则转3
- 是 sha1($auth-cookie) === $_SESSION["auth"] 吗?如果是,转22,否则转3
- $redirect == 是真的吗?如果是,则使用 301 GET 方法重定向回同一页面。否则转到 23
- 这是我的超级秘密星际迷航壁纸(内容)。
一个漫长的过程,但(希望)涵盖所有场景。
将所有这些算法保存在password.php
要保护的每个文件的顶部,包括该文件。只有在经历了所有可能的场景后,才能对秘密内容进行控制。每次出现故障时,脚本都会显示登录表单并退出。
它还实现了 Post-Redirect-Get ( Wikipedia ) 方法,您可以在其中获取 POST 请求,对其进行处理,然后使用 GET 方法将用户重定向回来,以防止在 Back & Refresh 按钮按下时提交双重表单。
上述描述中可能存在拼写错误或混合概念。让我知道任何改进。