Codeigniter curl 如何发送 CSRF 令牌?

Codeigniter curl how to send CSRF token?

我在使用 curl 填写另一页上的表单时遇到问题。如何在 Codeigniter 中下载并插入 CSRF 令牌?在不使用 CSRF 的情况下,添加表单没有任何问题。 CSRF 看起来像这样:

<input type="hidden" name="csrf_test_name" value="795e736ebd33938c7371e50b2085f6d7" />   

我的整个 curl 代码如下所示

$curl_connection = 
  curl_init('http://localhost/form');
 curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30);
 curl_setopt($curl_connection, CURLOPT_USERAGENT, 
  "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl_connection, CURLOPT_COOKIEFILE, APPPATH . '/cookies.txt');
curl_setopt($curl_connection, CURLOPT_COOKIEJAR, APPPATH . '/cookies.txt');


$result = curl_exec($curl_connection);

  $doc = new DOMDocument();
  $doc->loadHTML($result);
  $token = $doc->getElementById("csrf_test_name")->attributes->getNamedItem("value")->value;

  $post_data['title'] = 'Myname';
  $post_data['csrf_test_name'] = $token;
  $post_data['email'] = 'my@email.com';


foreach ( $post_data as $key => $value) {
    $post_items[] = $key . '=' . $value;
}

$post_string = implode ('&', $post_items);

curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string);

$result = curl_exec($curl_connection);

print_r(curl_getinfo($curl_connection));
echo curl_errno($curl_connection) . '-' . 
curl_error($curl_connection);


curl_close($curl_connection);
    }

我是curl这个话题的初学者,谁能帮我看一下这个csrf?在此先感谢您的帮助。

我已经测试过了,有效:

首先需要将name改成id:

<input type="hidden" id="csrf_test_name" value="795e736ebd33938c7371e50b2085f6d7" /> 

因为您正在使用 getElementById("csrf_test_name")

其次,你需要像这样获取属性值:

$token = $doc->getElementById("csrf_test_name")->getAttribute('value');

除非出现其他错误,否则你应该没问题。

P.S. 你在这里使用过 PHP XML DOM Parser 但通常用于这种工作 PHP Simple HTML DOM Parser被使用。为什么?因为我们正在解析 HTML :)

如果数据是 XML,那么我们将讨论节点,我们可以像这样以更清晰的方式获取值:

$token = $doc->getElementById("csrf_test_name")->nodeValue;