PHP 自定义会话处理程序不适用于某些域

PHP Custom Session Handler not working on some domains

我们有几个具有相同代码库的优质域。我们正在从使用本机 PHP 会话处理程序转换为将会话数据写入 MySQL 的自定义会话处理程序。在某些域上,会话处理被破坏,因为写入数据库的会话数据已损坏。

起初我们认为这可能与不同域上的不同 PHP 级别有关。但是,我们已将此排除在外,因为它不工作的域与它工作的域具有相同的 PHP 级别。

这个问题似乎与 。但是,在我们的例子中,问题并没有通过添加 session_write_close().

来解决

这是两个不同实例的一些调试输出,清楚地显示了正在发生的事情。在每种情况下,首先显示 $_SESSION 的 print_r,然后是将写入数据库的会话数据的内容:

在指定为 "local" 的第一个域上:

写入会话数据之前 print_r:

数组([调试] => 数组([0] => 会话 ID e2104hafmvtur2rsof78m918gs)[scr_width] => 2560 [recent_page_view_history] => 数组([0] => / [1] => / [2] => / [3] => / [4] => / [5] => / ) [my_user_label_full] => 独立销售代表 [my_user_label_short] => Rep [opp_user_type_id] => 2 [opp_user_label_full] => Principal [opp_user_label_long] => New Line [opp_user_label_long_seo] => Independent Sales Companies & New Line [opp_user_label_short] => 负责人 [user_value_stmt] => 行业专长 [opp_user_value_stmt] => 销售机会 [with_or_as] => 作为独立销售代表。本指南对于雇用销售代表的公司,将帮助您了解如何成为更好的销售代表。[is_help_open] => 1 [referrer] => / [IE_warning_given] => 1 [link_mode] = > 0 [isTouchScreen] => 0 [dynamicInputWording] => 将光标指向 [dynamicInputWordingCapitalized] => 将光标指向 [devicePixelRatio] => 2 )

写入前——数据传递到自定义会话处理程序 write():

调试|a:1:{i:0;s:37:"Session ID e2104hafmvtur2rsof78m918gs";}scr_width|s:4:"2560";recent_page_view_history|a:6 :{i:0;s:1:"/";i:1;s:1:"/";i:2;s:1:"/";i:3;s:1:"/"; i:4;s:1:"/";i:5;s:1:"/";}my_user_label_full|s:21:"Independent Sales Rep";my_user_label_short|s:3 :"Rep";opp_user_type_id|i:2;opp_user_label_full|s:9:"Principal";opp_user_label_long|s:8:"New Line";opp_user_label_long_seo|s:42:"Independent Sales Companies & New Line";opp_user_label_short|s:9:"Principal";user_value_stmt|s:18:"Industry Expertise";opp_user_value_stmt|s:17:"Sales Opportunity";with_or_as|s:117:"as an Independent Sales Rep. This guide for companies that hire reps will help you understand how to be a better rep.";is_help_open|b:1;referrer|s:1:"/" ;IE_warning_given|b:1;link_mode|i:0;isTouchScreen|s:1:"0";dynamicInputWording|s:20:"point your cursor at";dynamicInputWordingCapitalized|s:20:"Point your cursor at";设备像素比|s:1:"2";

以上内容符合预期,网站正常运行。

在指定为 "dev" 的第二个域上:

写入会话数据之前 print_r:

数组([调试] => 数组([0] => 会话 ID v301fcrls9ijktjtlc7n4gd3n5)[scr_width] => 2560 [recent_page_view_history] => 数组([0] => / landing-page.php [1] => /landing-page.php [2] => /landing-page.php [3] => /landing-page.php [4] = > /landing-page.php [5] => /landing-page.php ) [my_user_label_full] => 校长 [my_user_label_short] => 校长 [opp_user_type_id] => 1 [opp_user_label_full] => 独立销售代表 [opp_user_label_long] => 销售代表 [opp_user_label_long_seo] => 独立销售代表 [opp_user_label_short] => 代表 [ user_value_stmt] => 销售机会 [opp_user_value_stmt] => 行业专业知识 [with_or_as] => 拥有独立销售代表。[is_help_open] => 1 [推荐人] = > /landing-page.php [IE_warning_given] => 1 [link_mode] => 0 [isTouchScreen] => 0 [dynamicInputWording] => 将光标指向 [dynamicInputWordingCapitalized] => Point你的光标在 [devicePixelRatio] => 2 [site_user_type] => 2 [lp_source] => register-external )

写入前——数据传递到自定义会话处理程序 write():

pQkKjjiuhsxKkLD5bG1pcvfRiU073NotPwuYW3TrIAEwiKACrZ1s6dbIQmOeo7430UQAYgu_GENi_KhZx4vSUdaV4iXmSOVxNZgoNC_7-xDzOMDdRo7zp3sk-_aEv3XyenNiNtcy5GkE7UH1O1qKG-WBXel7bDNJ6hVUaadz9DoBwzhHFid5O5TOBT9gccwzAab2DWN-sa4vjwSDwaQ03rxquQT07iv4T_BQPvB2_pLYB_fz7GSI470o-bePEb4N209gd3oUA4xlg0Hw4pCssCN6FO6vtamNzaTqXDpS-f9nGhxpALp1eUZ1ts9nzbAZQ_llj0XbOW3FtnmnargZjbigJBWvL5XmD_bg5yIZwCHxJ4w8CWrKjasjfuInLMmzi02ViEtjmxtCZ5kLMETjE42MOSRuqrK7wr6zZFEha3gK2wfzQvrIwbr3ZEQTOpzBinYggiECiLAkpH4qy6XTjgnc-RT4_r4L7_LD2rBtXKjm3gNJgjZeLjeUMZubXBcLVGiW1ELuLgq0zHmU6ppIAMhk1rkThOMq3qgyQ0rsJGauTPDrImWzbbbnBgbooYywscjZjf-KNoRyCEaZRFga1zEeQWheEYFO7miVXFi-BSZZYJfXFHuto-kcfV9yZHInlz9p1Lcgd0YpbVUeIwZb2MUPhhzASDUnu4uuy_iVUn6WsyuEciQVYhEDcLBYJ6zHlSTs46vOWJdjE19LR8HQQL5jKJZBJpeC_jqgTNDWsVC5B1hZKpFswDZnOrUgEKOS9rHfusYOw0Ydczhr67TBTzCVUZvJVbm77LgBuY-JuLCv2Yv6mMCltXohtxMhb5t6PMXTnQTsinJD_SdY0YQZbAo26iPlO3u690IJd2tncPFZavwcflKodm_KW0LLtUR4CX4MZ0tmqY0qB1lkW8qgri6aZKAvgurr9BZhZcNqcsnAb6Po7zLdZOtwM3KF51LBzbcxGiDG6yWUy_9nw9p_y9GadXbfhfFbmR5jTQsaJLxR2-Y_2TiMxhgkWu7G2Buv6IZqUD-dCvU9vXQTnyUhlVijsO1pP02IxqtyO4D8cGp4k8l7IxeuqxsbX2oj7IdhiYIwG5t5IfEKTOQiimjPV0jSsBhwIftD5U-ofwpEQjcd7MLrzm7iX3eZuFnVvvNsMg_TCOScvs4b0DhV46KdDLfdD4WMoVhI6QnFH4s7jiqI9TYQNLRqSZNqO1cdFGHSyLcT1qGpDpZn0-ljpV_nzrYDXe6d2fsejqBZs_aWAZQFFJ7qMwUzVX53dzLgTf3ziAzPwPayQl8NBd8VptIKiVLZfN1v0tofRPuNXXVUd2s.

如您所见,数据不是特殊的序列化版本,而是以某种方式被混淆了。会话处理已损坏。

在指定为 "qa" 的域上,输出与 "local" 相同。请注意 "local" 有 php 7.1,而 "dev" 和 "qa" 都有 php 5.6。所有三个域的 php.ini 文件具有相同的会话设置。*变量。

问:session数据混淆的原因是什么?

我们找到了解决方案。 Suhosin 在某些域上启用,但在其他域上未启用。 Suhosin 会自动加密会话数据。

随着我们的前进,我们将失去 Suhosin,因为它似乎不是 PHP 7+ 的组成部分。要么不可用,要么编译不正确。