智能PHP会话处理/安全性

智能PHP会话处理/安全性,php,session,authentication,Php,Session,Authentication,我已经决定为我的应用程序处理身份验证的最佳方法是从头开始编写自己的会话处理程序。就像在《外星人》中一样,这是确保一件事情按照你希望的方式完成的唯一方法 也就是说,我遇到了一些障碍,当涉及到我的肉身出了最初的设计。我本来打算以混合方式使用PHP的会话处理程序,但我担心数据库的并发性问题。以下是我的计划: 我要做的第一件事是检查IP(甚至可能是会话)是否存在未经授权的蜜罐尝试。我写了一些关于睡眠调皮的条件句。这里的大问题显然是在哪里存储我的黑名单以获得最佳的读取速度 session\u id生成、散

我已经决定为我的应用程序处理身份验证的最佳方法是从头开始编写自己的会话处理程序。就像在《外星人》中一样,这是确保一件事情按照你希望的方式完成的唯一方法

也就是说,我遇到了一些障碍,当涉及到我的肉身出了最初的设计。我本来打算以混合方式使用PHP的会话处理程序,但我担心数据库的并发性问题。以下是我的计划:

  • 我要做的第一件事是检查IP(甚至可能是会话)是否存在未经授权的蜜罐尝试。我写了一些关于睡眠调皮的条件句。这里的大问题显然是在哪里存储我的黑名单以获得最佳的读取速度

  • session\u id生成、散列并存储在$\u session[myid]中。同一令牌的单独部分存储在第二个$\u会话[mytoken]中。然后,相应的数据存储在表X中,这是一个我没有确定的位置(这是这个问题的根源)

  • 然后,每个后续请求都会验证[myid]、[mytoken]是否符合我们的预期,然后为下一个请求重新颁发新凭据

  • 根据会话的状态,可以执行更明显的ACL功能

  • 这是我的偏执狂会话处理程序的高级概述。以下是我一直想问的问题:

    I.存储IP ACL的最佳方式是什么?我应该给主机写信/读书吗?我的方法是否存在性能问题?

    II。我的MitM预防方法似乎还可以,还是我在比较多个指标时过于偏执?存储此信息的最佳方式是什么,这样我就不会在80-100个用户中遇到麻烦?

    III.我是否在不必要地使用持续会话再生+写回来重击我的服务器?有更好的方法吗?

    我最初是为一个小应用程序写这篇文章的,但我更希望它是一个可重用的组件,我可以与全世界共享,所以我想确保它尽可能的可访问和安全


    提前谢谢

    写入主机。拒绝

    虽然这是一个好主意,如果你想从你的服务器上完全IP禁止一个用户,它将只适用于一台服务器。除非你在多个服务器之间进行某种安全的传播(天啊,听起来已经很可怕了),否则你将永远被困在一台服务器上

    你必须考虑关于使用Hoo.S.拒绝的要点:

    • 安全性:打开对与主机一样重要的文件的访问权限。拒绝web服务器用户
    • A中的痛苦:管理来自不同进程的多个写入(例如DenyHost)
    • A中的痛苦:如果您想授予访问以前在以后被禁止的IP的权限,请安全地修改文件

    我建议您只需在应用程序中的应用程序级别上禁止IP地址。您甚至可以将被禁止的IP地址存储在一个中央数据库中,这样它就可以由多个子系统共享,并且仍然在应用程序级别强制执行。

    I.存储IP ACL的最佳方法是将被禁止的IP推送到SQL数据库,而SQL数据库不会遇到诸如写入文件之类的并发问题。然后,外部脚本(定期或触发器)可以生成IPTABLES规则。您不需要在每次访问时重新读取数据库,只在检测到错误行为时才进行写入

    二,。如果你在透明代理或移动设备背后为客户提供服务,那么在公共互联网上固定IP并不是一件好事——他们的IP发生了变化。如果用户想要此功能(取决于您的受众,如果他们知道IP意味着什么…),请允许用户在首选项中进行选择。我的解决方案是为每个(页面)请求生成唯一的令牌,在该页面中重复使用AJAX请求(而不是介入资源问题-随机数、会话数据存储等)。我生成的令牌存储在会话中,并被记住几分钟。这让用户打开几个选项卡,返回并在先前打开的选项卡中提交。我不绑定到IP

    三、 这取决于。。。您提供的数据不足,无法回答。以上内容可能完全满足您的需求,每天约有500名用户访问您的站点5分钟,一次。或者,在聊天网站/游戏中,它甚至可以在一个小时内容纳1000个独特的concurent用户——这取决于您的应用程序正在做什么,以及您对可以缓存的数据的缓存程度

    设计、测试、基准测试。测试会话处理是否是您的资源问题,而不是其他问题。好的算法不应该让你陷入资源问题。DoS防御包括在内,它不应该是应用程序中的代码。应用程序可能会提示DoS预防机制该做什么,并让防御使用专用工具(见答案I)

    不管怎么说,如果你将来遇到资源问题,最好的解决办法就是使用新的硬件。对某些人来说,这可能听起来很粗鲁,甚至不称职,但计算6个月后新服务器的价格,实际上比您的工作价格高30%:为新服务器支付600美元,并增加130%的马力,或者为自己每月支付100美元,提高5%(好的,提高40%,但如果一周的价值为25美元,则可能会发生严重变化)


    如果您从头开始设计,请先阅读,然后在谷歌上搜索会话劫持、会话固定和类似字符串。

    我一直在从技术角度考虑所有参与者:纯文本、mysql(担心锁定)、NoSQL ala Mongo等。我愿意接受所有建议!如果每个请求都为下一个请求重新颁发了新凭据,则可能会中断基于选项卡的导航。此外,有些公司有不止一个互联网连接(冗余、负载平衡),因此有两个请求