php curl方法总结

0x00 前言

做web安全的同时也需要优秀的开发能力,所以最近想提升一下自己python和php的开发能力,对一些经常用的方法做一个总结,当作笔记。

curl方法在总结ssrf漏洞时用过,但是我当时没有做详细的说明,就放在这里总结一下。

0x00 curl

PHP的libcurl库用来与各种的服务器使用各种类型的协议进行连接和通讯。

libcurl目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。libcurl同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP 基于表单的上传、代理、cookies和用户名+密码的认证。

PHP中使用cURL实现Get和Post请求的方法。

百度百科用一句话总结了curl的能力:

  • php curl就是php中的数据传输神器。

0x01 基本方法

可以看到php curl库中封装的方法特别多,但我们平时用curl请求,大多数情况要做的的基本步骤有如下四步:

①:初始化

curl_init()

初始化一个新的会话,返回一个cURL句柄,供curl_setopt(), curl_exec()和curl_close() 函数使用。

用法:

  • curl_init(url)

参数:

  • url:如果提供了该参数,CURLOPT_URL 选项将会被设置成这个值。

返回值:

  • 如果成功,返回一个cURL句柄,出错返回 FALSE。

②:设置属性

curl_setopt()

为给定的cURL会话句柄设置一个选项。

用法:

  • curl_setopt ( resource $ch , int $option , mixed $value )

参数:

  • ch: 由 curl_init() 返回的 cURL 句柄。
  • option: 需要设置的CURLOPT_XXX选项。
  • value:将设置在option选项上的值。

返回值:

  • 成功时返回 TRUE, 或者在失败时返回 FALSE。

③:执行并获取结果

curl_exec()

执行给定的cURL会话。

用法:

  • curl_exec ( resource $ch )

参数:

  • ch: 由 curl_init() 返回的 cURL 句柄。

返回值:

  • 成功时返回 TRUE, 或者在失败时返回 FALSE。 然而,如果 CURLOPT_RETURNTRANSFER选项被设置,函数执行成功时会返回执行的结果,失败时返回 FALSE 。

④:释放句柄

curl_close()

关闭一个cURL会话并且释放所有资源。cURL句柄ch 也会被释放。

用法:

  • curl_close ( resource $ch )

参数:

  • ch: 由 curl_init() 返回的 cURL 句柄。

返回值:

0x02 get请求

get请求是http请求中最基本的请求,一个普通的get请求只需初始化后,配置好url和一定量的参数,然后执行即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://www.baidu.com');
//设置头文件的信息作为数据流输出
//curl_setopt($curl, CURLOPT_HEADER, 1);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0);
//执行命令
$data = curl_exec($curl);
//关闭URL请求
curl_close($curl);
//显示获得的数据
//print_r($data);
var_dump($data);
?>

可以看到,设置CURLOPT_RETURNTRANSFER为0,使用php请求百度页面,结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://www.baidu.com');
//设置头文件的信息作为数据流输出
//curl_setopt($curl, CURLOPT_HEADER, 1);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//执行命令
$data = curl_exec($curl);
//关闭URL请求
curl_close($curl);
//显示获得的数据
//print_r($data);
var_dump($data);
?>

如果设置CURLOPT_RETURNTRANSFER为1,则不会将获取的页面直接输出在页面内,结果如下:

0x03 post请求

post请求也是http请求中很重要的一种,既然是post请求,肯定要额外设置要post的数据才行,curl中需要配置CURLOPT_POST为1代表本次请求是post类型,然后再将要请求的数据通过CURLOPT_POSTFIELDS配置进本次请求,然后执行就可以提交post请求。

这里我们用上一篇有关iframe框架钓鱼的留言界面进行测试,我们将留言的昵称和内容设置好,通过php curl方法请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$curl = curl_init();
curl_setopt($curl,CURLOPT_URL,"http://127.0.0.1/curl/xss.php");
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//设置请求模式为post型
curl_setopt($curl, CURLOPT_POST, 1);
//配置post的数据
$post_data = array(
"name" => "curl_test",
"message" => "heyheyhey"
);
//全部数据使用HTTP协议中的"POST"操作来发送。
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
//执行请求
$data = curl_exec($curl);
//关闭请求
curl_close($curl);
//显示数据
print_r($data);
?>

根据返回的页面,发现这条留言已经被写入。

0x04 总结

在需要使用php获取页面内容时,其实可以通过更加简单的file_get_contents()函数,如下:

1
2
3
4
<?php
$data=file_get_contents("http://www.baidu.com");
print_r($data);
?>

但是学习curl是非常有必要的,curl虽然配置的参数更繁杂,但是相对应的支持的操作也就更多,比如cookies、验证、表单提交、文件上传等等,需要更加细致的操作时,就应该选用curl。