You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP通过CURL获取响应中隐藏input的csrf_token值的问题

如何从CURL响应中提取隐藏input的CSRF Token值

嘿,我来帮你搞定这个获取CSRF Token的问题!你遇到的问题主要是正则匹配的写法不够灵活,或者没有准确捕获到目标值,下面给你两种靠谱的解决方案:

方法一:优化正则表达式

你之前的正则要么只匹配到了csrf_token字符串(没捕获value),要么因为引号类型/长度不匹配导致失败。试试这个更灵活的正则:

$rets = curl_exec($ch);
// 匹配双引号包裹的name和value,兼容属性间的空格,匹配40位十六进制Token
if (preg_match('/name="csrf_token"\s+value="([a-f0-9]{40})"/i', $rets, $matches)) {
    $csrfToken = $matches[1];
    echo "获取到的CSRF Token: " . $csrfToken;
}

正则说明:

  • \s+:匹配name和value属性之间任意数量的空白字符(包括空格、换行)
  • [a-f0-9]{40}:匹配示例中40位的十六进制Token(你之前写的32位和示例不符,这也是匹配失败的原因之一)
  • /i:忽略大小写,避免因HTML属性大小写差异导致匹配失败
  • 用单引号包裹正则,避免双引号转义的麻烦

如果遇到的HTML里value用单引号包裹,也可以改成兼容单双引号的版本:

preg_match('/name=["\']csrf_token["\']\s+value=["\']([a-f0-9]{40})["\']/i', $rets, $matches)

方法二:使用DOM解析(更推荐)

正则处理HTML很容易因为结构小变化失效,而DOM解析是更可靠的方案,适合处理任意规范或不规范的HTML:

$rets = curl_exec($ch);

$dom = new DOMDocument();
// 抑制HTML解析时的错误提示(很多网页代码不严格符合标准)
libxml_use_internal_errors(true);
$dom->loadHTML($rets);
libxml_clear_errors();

$xpath = new DOMXPath($dom);
// 精准定位type为hidden且name为csrf_token的input元素
$csrfElements = $xpath->query('//input[@type="hidden" and @name="csrf_token"]');

if ($csrfElements->length > 0) {
    $csrfToken = $csrfElements->item(0)->getAttribute('value');
    echo "获取到的CSRF Token: " . $csrfToken;
}

这种方法不管input标签里的属性顺序如何,或者有多少空格,都能准确找到目标元素并提取value值,稳定性比正则高很多。

你之前代码的问题分析

  • 第一个正则preg_match("/csrf_token/", $rets, $spoof):只是匹配了csrf_token这个字符串,没有捕获value部分,所以$spoof里只有匹配到的字符串,没有Token值
  • 第二个正则用了单引号value='([a-zA-z0-9]{32})',但示例中的HTML是双引号value="...",而且Token长度是40位不是32位,所以匹配不到

内容的提问来源于stack exchange,提问作者Mahmoud Khatib

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:02:48