【问题标题】:PHP setting var to only a portion of a stringPHP将var设置为字符串的一部分
【发布时间】:2016-05-07 07:35:37
【问题描述】:

我正在制作一个面板,它将使用来自另一个论坛的会话数据来授予它权限。基本上,当用户登录我们的论坛并在论坛上创建会话和信任时,他们可以单击面板,面板将检查他们的浏览器 cookie 中的会话 ID 和信任 ID。然后它获取该信任 ID 并检查论坛的数据库中与该信任关联的用户 ID。然后获取会话 ID 并验证它是否属于该用户 ID。问题是,当我获得会话 ID 时,关联的用户 ID 是我必须强制转换才能从字段中获取数据的 blob 的一部分。所以我得到这样的结果:

('7c64c90413beb7d139c64ccc8b13380b', 
'a:12:{s:12:"sessionStart";i:1454075264;s:2:"ip";s:4:"b???";s:11:"sessionCsrf";s:16:"-2Yx13nBLdstUj4H";

s:7:"user_id";i:20;

s:13:"password_date";i:1453353041;s:16:"previousActivity";i:1454072099;s:13:"trophyChecked";b:1;s:16:"promotionChecked";b:1;s:16:"dismissedNotices";a:0:{}s:15:"lastNoticeReset";i:0;s:13:"canAdminUsers";b:1;s:20:"userModerationCounts";a:2:{s:5:"total";i:0;s:13:"lastBuildDate";i:1454075264;}}'),

我知道那里有很多内容,但我挑出了对我很重要的部分。返回的第一列是会话 id,我用它来验证用户 id,但用户 id 位于第二列中所有废话的中间。所以你可以看到我在哪里挑出定义,我想做的只是将“user_id;i:”之后的“20”分配给一个变量,然后丢弃其余的。我确信这很简单,但在这一点上,我想我只是把它拿出来并旋转轮子。我在想爆炸,但该数据的结构似乎不是一个选项。

【问题讨论】:

    标签: php mysql var


    【解决方案1】:

    该数据只是 PHP serialize() 调用的结果。您可以将其传递给unserialize(),它会为您提供一个包含值的数组。

    <?php
    
    $str = 'a:12:{s:12:"sessionStart"…etc…etc…i:1454075264;}}';
    
    $arr = unserialize($str);
    
    var_dump($arr['user_id']);
    

    如果您尝试仅从 MySQL 中提取值,出于某种原因,我在两周前对包含大量嵌套 SUBSTR()LOCATE() 的糟糕查询做了类似的事情。我不会推荐它。特别是因为在我的情况下,我正在执行一次性报告查询,而您正在尝试使用它进行身份验证。人们可能会尝试使用特制的 cookie 来规避您的字符串提取并获得非法访问权限。

    【讨论】:

    • 好吧,数据直接来自查询,我还没有使用任何 php,这就是我在数据库上运行查询时得到的。
    • 那么它会返回一个关联的数组吗?即: var["user_id"] 等于 20?
    • 对不起,从您的问题中并没有很清楚您没有使用 PHP 来访问数据。是的,它将返回一个关联数组。我添加了一个代码示例,并谈到了如何(不)单独在 MySQL 中执行此操作。
    猜你喜欢
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 2023-03-24
    • 2016-04-21
    • 1970-01-01
    相关资源
    最近更新 更多