学习SSRFSSRF基础知识
FLYFISHcurl
1. curl_init():初始化 cURL 会话
功能
创建一个新的 cURL 句柄(资源对象),用于后续配置和请求。
语法
1
| resource|false curl_init(?string $url = null)
|
参数
$url(可选):初始化时直接设置请求的 URL。
- 若留空,需后续通过
curl_setopt(CURLOPT_URL) 设置。
返回值
- 成功:返回 cURL 句柄(
resource 类型)。
- 失败:返回
false(极罕见,通常因内存不足)。
示例
1
| $ch = curl_init("https://api.example.com/data"); // 直接初始化并设置 URL
|
注意事项
- 必须关闭句柄:使用后务必调用
curl_close($ch) 释放资源。
- 复用句柄:可通过
curl_reset($ch) 重置配置,避免重复初始化。
2. curl_setopt():配置 cURL 选项
功能
设置 cURL 会话的请求参数,控制请求方式、超时时间、返回格式等核心行为。
语法
1
| bool curl_setopt(resource $ch, int $option, mixed $value)
|
参数
$ch:cURL 句柄(由 curl_init() 返回)。
$option:选项常量(如 CURLOPT_URL)。
$value:选项值,类型由 $option 决定(如字符串、布尔值、数组)。
常用选项
| 选项常量 |
作用 |
值类型 |
CURLOPT_URL |
设置请求 URL |
字符串 |
CURLOPT_RETURNTRANSFER |
返回内容到变量(不直接输出) |
true/false |
CURLOPT_POST |
启用 POST 请求 |
true/false |
CURLOPT_POSTFIELDS |
设置 POST 数据(表单或 JSON) |
字符串/数组 |
CURLOPT_HTTPHEADER |
设置请求头(如 Content-Type) |
数组 |
CURLOPT_TIMEOUT |
设置超时时间(秒) |
整数 |
返回值
- 成功:返回
true。
- 失败:返回
false(如无效选项或值类型错误)。
示例
1 2 3
| curl_setopt($ch, CURLOPT_URL, "https://api.example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回内容到变量 curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type: application/json"]);
|
注意事项
- 选项顺序:必须在
curl_exec() 前调用。
- 类型匹配:选项值与类型严格对应(如
CURLOPT_TIMEOUT 必须为整数)。
3. curl_exec():执行 cURL 请求
功能
根据配置发起 HTTP 请求,并返回服务器响应。
语法
1
| mixed curl_exec(resource $ch)
|
参数
返回值
- 成功且
CURLOPT_RETURNTRANSFER=true:返回响应内容(字符串)。
- 成功但
CURLOPT_RETURNTRANSFER=false:直接输出内容,返回 true。
- 失败:返回
false(需结合 curl_errno() 排查错误)。
示例
1 2 3 4 5 6
| $response = curl_exec($ch); if ($response === false) { echo "Error: " . curl_error($ch); } else { echo $response; }
|
注意事项
- 输出控制:务必设置
CURLOPT_RETURNTRANSFER=true 避免直接输出内容。
- 错误处理:必须检查返回值是否为
false,防止静默失败。
4. curl_close():关闭 cURL 会话
功能
释放 cURL 句柄占用的系统资源,终止会话。
语法
1
| void curl_close(resource $ch)
|
参数
示例
1
| curl_close($ch); // 释放资源
|
注意事项
- 必须调用:未关闭句柄会导致内存泄漏。
- 不可复用:关闭后句柄失效,需重新初始化。
5. curl_errno():获取错误代码
功能
返回最后一次 cURL 操作的错误代码(整数形式)。
语法
1
| int curl_errno(resource $ch)
|
参数
$ch:已执行过 curl_exec() 的 cURL 句柄。
返回值
- 无错误:返回
0。
- 有错误:返回非零错误码(如
6 表示域名解析失败)。
常见错误码
| 错误码 |
常量名 |
含义 |
6 |
CURLE_COULDNT_RESOLVE_HOST |
域名解析失败 |
7 |
CURLE_COULDNT_CONNECT |
连接服务器失败 |
28 |
CURLE_OPERATION_TIMEOUTED |
请求超时 |
示例
1 2 3
| if (curl_errno($ch)) { echo "Error Code: " . curl_errno($ch); // 输出错误码 }
|
注意事项
- 调用时机:必须在
curl_exec() 之后调用,否则返回 0。
- 组合使用:通常与
curl_error() 搭配获取详细错误信息。
完整使用流程示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| // 1. 初始化 $ch = curl_init();
// 2. 配置选项 curl_setopt($ch, CURLOPT_URL, "https://api.example.com/data"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 10);
// 3. 执行请求 $response = curl_exec($ch);
// 4. 错误处理 if ($response === false) { $errorCode = curl_errno($ch); $errorMsg = curl_error($ch); echo json_encode(["error" => "Code $errorCode: $errorMsg"]); } else { echo $response; }
// 5. 关闭会话 curl_close($ch);
|
总结
| 函数 |
核心作用 |
关键注意事项 |
curl_init() |
创建会话句柄 |
必须关闭句柄(curl_close()) |
curl_setopt() |
配置请求参数 |
严格匹配选项类型 |
curl_exec() |
执行请求并返回响应 |
检查返回值是否为 false |
curl_close() |
释放资源 |
不可省略,避免内存泄漏 |
curl_errno() |
获取错误代码 |
必须与 curl_error() 结合使用 |
通