PHP会话安全

saint_groceon 125 php security

使用PHP维护负责任的会话安全性有哪些指导原则?整个网络上都有信息,这是关于它们在一个地方落地的时间!

grom.. 88

要确保会话安全,有几件事要做:

  1. 在对用户进行身份验证或执行敏感操作时使用SSL.
  2. 每当安全级别更改(例如登录)时重新生成会话ID.如果您愿意,您甚至可以在每个请求中重新生成会话ID.
  3. 会议超时
  4. 不要使用寄存器全局变量
  5. 在服务器上存储身份验证详细信 也就是说,不要在cookie中发送用户名等详细信息.
  6. 检查一下$_SERVER['HTTP_USER_AGENT'].这为会话劫持增加了一个小障碍.您还可以检查IP地址.但是,这会导致由于多个Internet连接上的负载平衡而导致IP地址发生变化的用户出现问题(在我们的环境中就是这种情况).
  7. 锁定对文件系统上会话的访问或使用自定义会话处理
  8. 对于敏感操作,请考虑要求登录用户再次提供其身份验证详细信息

  • @ The Rook,它可能是一个微不足道的障碍(攻击者可以使用他们自己的网站捕获受害者的用户代理)并通过默默无闻地依赖安全性,但它仍然是一个额外的障碍.如果在会话使用期间要更改User-Agent HTTP,则会非常可疑并且很可能是攻击.我从没说过你可以单独使用它.如果将其与其他技术结合使用,您将拥有更安全的网站. (24认同)
  • 仅对某些操作使用SSL是不够的,除非您有加密和未加密流量的单独会话.如果您通过HTTPS和HTTP使用单个会话,攻击者将在第一次非HTTPS请求时窃取它. (15认同)
  • 如果您正在检查用户代理,则在切换兼容模式时,您将阻止来自IE8用户的所有请求.看看我在自己的代码中追踪这个问题的乐趣:http://serverfault.com/questions/200018/http-302-problem-on-ie7.我正在检查用户代理,因为欺骗这是一件微不足道的事情,正如其他人所说的那样. (8认同)
  • -1用户代理很容易欺骗.你所描述的是浪费代码而不是安全系统. (6认同)
  • @grom我认为它就像把一块透明胶带放在你的门上,说它会阻止人们闯入. (5认同)

saint_groceo.. 15

一个准则是每次会话的安全级别更改时调用session_regenerate_id.这有助于防止会话劫持.


cmcculloh.. 11

我认为其中一个主要问题(在PHP 6中正在解决)是register_globals.现在的用于避免标准方法之一register_globals是使用$_REQUEST,$_GET$_POST阵列.

这样做的"正确"方法(从5.2开始,尽管那里有一个小小的错误,但是从6开始稳定,即将到来)是通过过滤器.

所以代替:

$username = $_POST["username"];

你会这样做:

$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);

甚至只是:

$username = filter_input(INPUT_POST, 'username');

  • 我同意,这并不是*完全*回答这个问题,但它绝对是问题答案的一部分.同样,这在已接受的答案中充实了一个要点:"不要使用寄存器全局变量".这告诉我该怎么做. (9认同)
  • 真?那么为什么在接受的答案中他们提到不使用寄存器全局?就大多数普通开发人员而言,即使技术上不是"会话"对象的一部分,也不会注册全局和形式变量处理属于"会话"的保护范围吗? (5认同)
  • 这与问题毫无关系. (2认同)

takeshin.. 11

我的两个(或更多)美分:

  • 不相信任何人
  • 过滤输入,转义输出(cookie,会话数据也是你的输入)
  • 避免使用XSS(保持HTML格式正确,请查看PHPTALHTMLPurifier)
  • 防御深度
  • 不要暴露数据

关于这个主题有一本很小但很好的书:Chris Shiflett的基本PHP安全性.

基本的PHP安全性http://shiflett.org/images/essential-php-security-small.png

在本书的主页上,您将找到一些有趣的代码示例和示例章节.

您可以使用上面提到的技术(IP和UserAgent),如下所述:如何避免身份盗用


raspi.. 9

这个会话固定文件有很好的指针可能会发生攻击.另请参阅Wikipedia上的会话固定页面.


Eric Lamb.. 5

根据我的经验,使用IP地址并不是最好的主意.例如; 我的办公室有两个IP地址,根据负载使用,我们经常使用IP地址遇到问题.

相反,我选择将会话存储在我服务器上的域的单独数据库中.这样,文件系统上没有人可以访问该会话信息.这对于3.0之前的phpBB非常有帮助(他们已经解决了这个问题),但我认为这仍然是一个好主意.