奇怪的是,您允许直接访问流程的第三步,用户名、地址等所有其他数据在哪里?
这是我要做的一些想法,一个完全安全的系统(可能不存在)将比我的简单步骤复杂得多。
请注意,您可能希望首先允许用户注册一些您可以知道他们是谁的信息(经过验证的电子邮件、经过验证的电话号码等),然后才进行信用卡操作,如果他们不断输入错误或无效的号码,您可以执行其他操作,例如将他们列入黑名单、打电话给他们、侮辱他们等。
note 2我花了很长时间写这个,我越读越想它似乎越糟糕,但既然已经写了,我还是会发布它。
开始前的一些注意事项:
- 只有一个地址,例如/authenticate/auth.php
- 该过程具有“状态”,并且根据此,它将显示/执行不同的操作。
- 对于不同的州,还有其他额外的文件,具体取决于州。
- 进程启动后,会创建一个会话并将其与用户 IP、进程状态和有关用户的任何其他可识别信息(例如“User-Agent”)相关联,这些数据将保存在服务器中。
- 似乎您想使用不同的页面显示不同的状态,所以会是这样。但实际上我会在一个页面中使用 ajax 调用。
- 没有可疑IP 地址的黑名单(正常或错误或完全错误的请求太多),如果需要可以添加,但复杂性会增加。你可能想也可能不想这样做,也许一个验证码就足够了,但是..
- 在某些情况下没有验证码可能会有所帮助,但我在此处描述的会话处理可能需要更改。
- 没有您可能想做的电子邮件验证。
假设进程状态是 ask_name、ask_address、ask_cc 等...
因此,当对 auth 页面 (/authenticate/auth.php) 有任何请求时,我们可以这样做:
1 如果“Referer”不是来自可能的流程启动器之一(主页等)或此页面(/authenticate/auth.php),我们将重定向到主页。结束。
第一步可以避免人们直接写地址或来自不受信任的页面。
2 如果没有此请求的会话信息:
2.1 如果有'user_name'参数并且'Referer'是这个页面(/authenticate/auth.php)
2.1.1 如果该用户名已经注册,则显示(包括,不重定向)'ask_name.php',并附加“用户已注册”的额外通知。结束。
2.1.2 为该用户创建一个会话,将其与它的IP、用户代理等、其他数据相关联。
2.1.3 设置状态为ask_address(第二个)并显示'ask_address.php'。结束。
2.2 Else(无参数或'Referer'错误)
2.2.1 显示“ask_name.php”。结束。
第二步显示第一个屏幕(ask_user)或第二个屏幕(ask_name),它会延迟会话的创建,直到我们确定用户想要做一些真实的事情。
它有几个问题:
- 一些用户(或程序)在没有会话但使用“用户名”的情况下连续发送请求,因此迫使您始终检查用户是否有效,并且可能会减慢速度。这可以使用几种不同的技术来避免,例如使用验证码或将某些 IP 列入黑名单一段时间。
- 有可能一个用户使用不存在的“user_name”启动该过程,但他很慢并且需要一些时间来完成该过程,而在这种情况下,第二个用户开始并以相同的方式完成该过程'user_name',所以当第一个用户要完成时,它会在最后一步失败。这可以通过几种不同的技术来避免,这些技术留作练习。
3 如果有这个请求的会话信息(这是上一步的else)
3.1 如果referer不是这个页面或者服务器中存储的IP和当前请求不一样或者其他一些数据比如User Agent不同或者状态无效(不在状态列表中),删除会话ID请求(因此浏览器将其删除)并显示“ask_name.php”以及额外的通知“看起来您的设备已更改!!!”。结束。
3.2“包含”状态页面:
3.2.1 如果参数通过且正确,则将状态设置为-next-state,并为其显示页面。如果是最后一个状态,做一些适合最后一个状态的事情。结束。
3.2.2 显示此状态的相同页面,并显示错误消息供用户重试。结束。
最后一步尝试确保请求不是来自其他计算机和/或会话密钥被盗。