html - 如何用php获取某个页面中的input的csrf_token?

 黑糖老姜茶 发布于 2022-11-15 11:04

比方说我想获取某个页面的input 里的值,比如一个注册页面往往会有一个隐藏域来存取后端给的随机token,然后我想获取这个token里的值,大概curl 可以完成吧,那是怎么做呢?求大佬给个demo 观摩一番

3 个回答
  • 如果使用的是laravel框架,有个Request对象。$request->get('__csrf__'); 这不就获取到了吗?

    2022-11-15 11:08 回答
  • 不太明确答主的问题。

    答主如果是想获取别人的 token,那正常来说是做不到的, MITM 可以做到。

    如果是想获取自己的 token,那用 curl 获得页面的源码,然后根据源码正则匹配一下就好了。

    懒,代码就不写了,见谅。。。

    2022-11-15 11:08 回答
  • 好问题,我这里有最好的答案。

    composer包:

    "symfony/css-selector": "3.1.*",
    "symfony/dom-crawler": "3.1.*",
    "guzzlehttp/guzzle": "6.2.*"

    php代码

    $body = (new \GuzzleHttp\Client)->get('http://bosonnlp.com/account/login')->getBody()->getContents();
    $csrf = (new \Symfony\Component\DomCrawler\Crawler($body))->filter('#csrf_token')->attr('value');
    var_dump($csrf);

    另外,下一步应该是POST登录吧?

    $res = (new \GuzzleHttp\Client)->post('http://bosonnlp.com/account/login', ['connect_timeout' => 10,
        'form_params' => [
            'csrf_token' => $csrf,
            'email' => 'xxx',
            'password' => 'xxx',
        ],
    ]);
    // 登陆后拿到的html
    $body = $res->getBody()->getContents();
    $dom = new \Symfony\Component\DomCrawler\Crawler($body);
    
    // 检查是否登录失败并抛出异常
    if ($err_str = $dom->filter('.email-warn')->text()){
        throw new \Exception($err_str);
    }
    

    补充

    对了,忘了说了,csrfToken是和session相关的,如果你获取csrf和登录post用的不是一个sessionid的话,csrf是无效的。
    所以,获取csrf和post登录请共用这一个client以共享同一个cookie。

    $client = new Client(['cookies'=>true]);

    把上面代码里的(new \GuzzleHttp\Client)换成$client即可

    2022-11-15 11:08 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有