php中常见可能产生ssrf漏洞的函数

总结了PHP中常见可能产生SSRF的函数

curl

PHP curl执行的代码流程

  1. 使用curl_init()函数创建一个curl句柄
  2. 使用curl_setopt()函数为curl句柄设置响应选项,php curl的丰富功能依靠此函数来实现
  3. 使用curl_exec()函数执行请求
  4. 使用curl_close()函数关闭curl句柄,释放内存

PHP curl基本用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$url = "http://192.168.101.111/index.php";

# 创建一个curl句柄
$ch = curl_init();

# 设置响应选项
curl_setopt($ch, CURLOPT_URL, $url); // 设置访问的url
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // curl请求执行时,将结果返回,而不是直接输出

# 执行curl请求,返回结果到变量
$response = curl_exec($ch);

# 关闭curl句柄
curl_close($ch);
echo $response;
?>

PHP curl GET和POST请求

GET请求
get请求直接通过构造url即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$data_get = array('a'=>1,'b'=>2);
$url = "http://192.168.101.111/index.php?" . http_build_query($data_get);
// http://192.168.101.111/index.php?a=1&b=2

# 创建一个curl句柄
$ch = curl_init();

# 设置响应选项
curl_setopt($ch, CURLOPT_URL, $url); // 设置访问的url
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // curl请求执行时,将结果返回,而不是直接输出

# 执行curl请求,返回结果到变量
$response = curl_exec($ch);

# 关闭curl句柄
curl_close($ch);
echo $response;
?>

POST请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$data_post = array('a'=>1,'b'=>2);
$url = "http://192.168.101.111/index.php";

# 创建一个curl句柄
$ch = curl_init();

# 设置响应选项
curl_setopt($ch, CURLOPT_URL, $url); // 设置访问的url
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // curl请求执行时,将结果返回,而不是直接输出
curl_setopt($ch, CURLOPT_POST, 1); // 设置为post方式提交
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_post); // 设置post提交的数据

# 执行curl请求,返回结果到变量
$response = curl_exec($ch);

# 关闭curl句柄
curl_close($ch);
echo $response;
?>

PHP curl组件相关函数

  函数名 函数介绍



curl_init 【常用】初始化一个curl会话,返回一个curl句柄;
curl_setopt 【常用】设置curl选项;
curl_setopt_array 【常用】使用数组的方式批量设置curl选项;
curl_copy_handle 克隆一个curl句柄和它的所有选项;
curl_exec 【常用】执行curl会话;
curl_pause  暂停并取消暂停一个连接(PHP 5.5以上版本);
curl_reset 将curl句柄的所有curl选项重置为默认值(PHP 5.5以上版本);
curl_getinfo 获取curl最后会话信息,包含消耗时间、上传下载字节数、传输速度等信息;
curl_errno 返回curl会话最后一次的数字错误代码;
curl_error 返回curl会话最后一次的字符串错误描述;
curl_strerror 通过curl数字错误代码返回字符串描述(PHP 5.5以上版本);
curl_close 【常用】关闭curl会话;
curl_escape  对指定字符串进行URL编码(PHP 5.5以上版本);
curl_unescape  对指定字符串进行URL解码(PHP 5.5以上版本);
curl_version 以数组的形式返回php curl版本信息;


curl_multi_init 创建一个curl批处理句柄(并发请求);
curl_multi_add_handle 向curl批处理句柄中添加单独的curl句柄;
curl_multi_remove_handle 从curl批处理句柄中移除某个curl句柄;
curl_multi_setopt 为curl批处理句柄设置选项;
curl_multi_exec 执行curl批处理句柄;
curl_multi_info_read 尝试从curl批处理句柄中获取 新curl子请求的完成信息;
curl_multi_getcontent 读取curl批处理句柄中curl子句柄的请求返回内容;
curl_multi_close 关闭curl批处理句柄;
curl_multi_select  等待所有curl批处理中的活动连接;
curl_multi_strerror 通过curl批处理数字错误代码返回字符串描述(PHP 5.5以上版本);



curl_share_init 初始化一个curl共享句柄(PHP 5.5以上版本);
curl_share_setopt 为 curl共享句柄设置选项(PHP 5.5以上版本);
curl_share_close 关闭curl共享句柄(PHP 5.5以上版本);

curl_file_create 创建一个curlfile对象(PHP 5.5以上版本);

PHP curl_setopt函数选项合集

选项名称 值类型 描述
网址 CURLOPT_URL string 【必须】指定需要获取的URL地址,也可以在curl_init()函数初始化会话的时候作为参数传入。
CURLOPT_PATH_AS_IS bool 是否不处理URL中的"../"。(curl 7.42.0、PHP 7.0.7以上版本)
CURLOPT_DEFAULT_PROTOCOL string 指定URL不带协议的时候,使用的默认协议(PHP 7.0.7以上版本)。
CURLOPT_HTTP_VERSION integer 使用的HTTP版本:CURL_HTTP_VERSION_NONE (默认值,让 curl选择),CURL_HTTP_VERSION_1_0 (强制使用 HTTP/1.0)或CURL_HTTP_VERSION_1_1 (强制使用 HTTP/1.1)。  
CURLOPT_PORT integer 指定连接端口,替换 URL 中的主机和端口。
CURLOPT_CONNECT_TO array 连接到指定的主机和端口,替换 URL 中的主机和端口。接受指定字符串格式的数组: HOST:PORT:CONNECT-TO-HOST:CONNECT-TO-PORT。( curl 7.49.0, PHP 7.0.7以上版本)
CURLOPT_CONNECT_ONLY bool 是否只做代理、验证、连接过程,但不传输数据。此选项用于 HTTP、SMTP 和 POP3。


CURLOPT_FOLLOWLOCATION bool 【常用】是否根据服务器返回的http头"Location:"信息,自定重定向到相关页面。
CURLOPT_MAXREDIRS integer 指定递归重定向的最大次数。
CURLOPT_AUTOREFERER bool "Location:"重定向时,是否自动设置header的"Referer:"信息。
CURLOPT_UNRESTRICTED_AUTH bool 是否CURLOPT_FOLLOWLOCATION重定向 header 中的多个 location 时继续发送用户名和密码信息,哪怕主机名已改变。
CURLOPT_POSTREDIR integer 位掩码, 设置当CURLOPT_FOLLOWLOCATION时, 么情况下需要再次 HTTP POST 到重定向网址:
1 (301 永久重定向);
2 (302 Found)
4 (303 See Other) ,
可以使用组合的形式:,如: 1 | 2。


CURLOPT_HTTPGET bool TRUE时会设置http的METHOD为GET(默认即为GET,所有只有METHOD被修改时才使用此选项)。
CURLOPT_CUSTOMREQUEST string HTTP请求时,指定自定义的Method,如:GET、POST、PUT、DELETE等。
CURLOPT_USERAGENT string 【常用】设置HTTP请求头"User-Agent: "字段值信息,用来伪装浏览器信息,让curl抓取更像真实的浏览器访问。
CURLOPT_REFERER string 【常用】设置HTTP请求头"Referer:" 字段值信息,用来伪装来路信息,让curl抓取更像真实的浏览器访问。
CURLOPT_ENCODING string 设置HTTP请求头中"Accept-Encoding: "的值,支持的编码有"identity"、"deflate"和"gzip",如果为空字符串"",会发送所有支持的编码类型 (curl 7.10以上版本)。
CURLOPT_HTTPHEADER array 【常用】以数组的形式设置http请求头信息,如:
array('Referer: http://aiezu.com', 'Accept-Language: zh-CN,zh;q=0.8')
cook
ies
CURLOPT_COOKIE string 【常用】设定HTTP请求头中"Cookie: "部分的内容,多个cookie用分号分隔,分号后带一个空格,如: "name=aiezu; site=aiezu.com"。
CURLOPT_COOKIEFILE string 【常用】从指定文件中读取cookie,并发送到http服务,文件中的cookie必须为Netscape格式。
CURLOPT_COOKIEJAR string 【常用】将HTTP响应头中的cookie保存到指定文件。
CURLOPT_COOKIESESSION bool 是否开启新的一次cookie会话,忽略之前存储的cookie会话信息。
代理 CURLOPT_HTTPPROXYTUNNEL bool 设置为TRUE时会通过指定的HTTP代理来传输。
CURLOPT_PROXY string 【常用】指定代理信息,如:8.8.8.8:8080,socks5://8.8.8.8:88。
CURLOPT_PROXYPORT string 指定代理服务器端口。
CURLOPT_PROXYTYPE integer 指定代理服务器类型,支持的值:CURLPROXY_HTTP (默认值) CURLPROXY_SOCKS4、 CURLPROXY_SOCKS5、 CURLPROXY_SOCKS4A 或 CURLPROXY_SOCKS5_HOSTNAME;(cURL 7.10以上版本)。
CURLOPT_PROXYAUTH integer 代理连接的认证方式,使用在CURLOPT_HTTPAUTH中的位掩码,当前仅支持 CURLAUTH_BASIC和CURLAUTH_NTLM (cURL 7.10以上版本)。
CURLOPT_PROXYUSERPWD string 一个用来连接到代理的"[username]:[password]"格式的字符串。
CURLOPT_PROXYHEADER array 传给代理的自定义HTTP头;(curl 7.37.0,  PHP 7.0.7以上版本)。
CURLOPT_PROXY_SERVICE_NAME string 代理验证服务的名称(curl 7.34.0,  PHP 7.0.7以上版本)。
POST
/
PUT
CURLOPT_POST bool 【常用】设置为TRUE时将强制以标准POST方式发送请求,标准POST方式HTML表单类型为"application/x-www-form-urlencoded";注意:如果此选项设置为TRUE,而CURLOPT_POSTFIELDS的参数为数组,那么数据将不会被提交到服务器。
CURLOPT_POSTFIELDS array
string
【常用】指定要使用HTTP协议中的"POST"方式来发送的数据; 接受两种格式的数据类型:
1、字符串格式: 这种格式是urlencoded后的字符串,类似'para1=val1&para2=val2&...'形式,这种格式通过HTML表单类型为"application/x-www-form-urlencoded"方式提交到服务器;
2、数组格式:这种格式是以字段名为键名,字段值为键值的数组,这种格式通过HTML表单类型为"multipart/form-data"方式提交到服务器,因此,数组格式可以用来发送文件;如要发送文件,在文件名完整路径前面加上“@”前缀, 文件类型可在文件名后以 ';type=mimetype' 的格式指定;从PHP 5.5.0开始, “@“前缀已被废弃,文件可通过CURLFile 发送; 如:
array('pic'=>'@/tmp/aiezu.com.png')
换成:
array('pic'=>new CURLFile('/tmp/aiezu.com.png'))
     
CURLOPT_SAFE_UPLOAD bool 设置为TRUE时,禁用"@"前缀发送文件,以增加安全性,这时发送文件可以通过CURLFile方式;(PHP 5.5添加此选项,PHP 7移除了此选项)
CURLOPT_PUT bool 【常用】设置为TRUE时,允许以HTTP PUT方式发送文件,此时必须设置CURLOPT_INFILE、CURLOPT_INFILESIZE选项;
CURLOPT_INFILE string 【常用】http put方式上传文件时需要读取的文件;
CURLOPT_INFILESIZE  integer 【常用】http put方式上传文件时需要读取的文件长度;
CURLOPT_READFUNCTION functionR 【常用】设置一个回调函数来,对HTTP PUT文件进行读取处理。此函数包含三个参数:
  参数一为curl的资源句柄;
  参数二为设置在CURLOPT_INFILE选项中,要读取文件的资源句柄;
  参数三为允许读取的最大数据数量;
函数返回当前读取到的字符串,返回空字符串作为 EOF(文件结束) 信号。
认证 CURLOPT_HTTPAUTH integer 【常用】使用的HTTP验证方法,可以是:CURLAUTH_BASIC、 CURLAUTH_DIGEST、 CURLAUTH_GSSNEGOTIATE、 CURLAUTH_NTLM、 CURLAUTH_ANY和 CURLAUTH_ANYSAFE,可以使用 | 位域(OR)操作符结合多个值,curl会让服务器选择支持的方法,并选择最好的那个;
  CURLAUTH_ANY是 CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM 的别名,
  CURLAUTH_ANYSAFE 是 CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM 的别名。
CURLOPT_USERNAME string 【常用】验证中使用的用户名;(curl 7.19.1, PHP 5.5.0以上版本)。
CURLOPT_USERPWD string 【常用】验证需要的用户名和密码,格式为:"[username]:[password]"。
CURLOPT_SERVICE_NAME string 验证服务的名称(curl 7.43.0, PHP 7.0.7以上版本)。
CURLOPT_LOGIN_OPTIONS string 可以设置特定的登录选项,如通过"AUTH=NTLM" 或者"AUTH=*"设置首选的登录选项,并结合CURLOPT_USERNAME 选项使用;(curl 7.34.0, PHP 7.0.7以上版本)。
CURLOPT_NETRC bool 是否使用~/.netrc文件获取用户名和密码来连接远程站点。
CURLOPT_KRB4LEVEL string KRB4 (Kerberos 4)安全级别,安全级别从低到高一次是:"clear"、"safe"、"confidential"、"private",默认为"private",这个选项设置为NULL时将禁用KRB4安全认证,目前 KRB4 安全认证只能用于FTP传输。
CURLOPT_XOAUTH2_BEARER string 指定OAuth 2.0 access token;(curl 7.33.0, PHP 7.0.7以上版本)。
证书 CURLOPT_SSLCERT string 【常用】指定一个SSL证书文件名;
CURLOPT_SSLCERTPASSWD string 【常用】使用CURLOPT_SSLCERT证书需要的密码;
CURLOPT_SSLCERTTYPE string 指定证书格式类型,支持的格式有"PEM" (默认值)、"DER"和"ENG";    (curl 7.9.3以上版本)
CURLOPT_CAPATH string 一个保存着多个CA证书的目录,这个选项配合CURLOPT_SSL_VERIFYPEER一起使用的。
CURLOPT_CAINFO string 【常用】一个保存着一个或多个用来让服务端验证的证书的文件名,这个参数仅仅在和CURLOPT_SSL_VERIFYPEER一起使用时才有意义,可能需要绝对路径。
CURLOPT_SSL_VERIFYPEER bool 【常用】是否禁止curl验证对等证书(peer's certificate),默认为FALSE;要验证的交换证书可以在 CURLOPT_CAINFO 选项中设置,或在 CURLOPT_CAPATH中设置证书目录;自cURL 7.10开始默认为 TRUE,从cURL 7.10开始默认绑定安装。
CURLOPT_SSL_VERIFYSTATUS bool 验证证书状态;(curl 7.41.0, PHP 7.0.7以上版本) 
密钥 CURLOPT_SSLKEY string 指定一个SSL私玥文件名。
CURLOPT_SSLKEYPASSWD string SSL私钥的密码;(由于此选项包含了敏感的密码信息,记得保证这个PHP脚本的安全。)
CURLOPT_KEYPASSWD string 使用CURLOPT_SSLKEY或CURLOPT_SSH_PRIVATE_KEYFILE 私钥时候的密码;(curl 7.16.1以上版本)。
CURLOPT_SSLKEYTYPE string CURLOPT_SSLKEY中指定的私钥的加密类型,支持的私钥类型为"PEM"(默认值)、"DER"和"ENG"。
CURLOPT_SSLENGINE string 用来在CURLOPT_SSLKEY中指定的SSL私钥的加密引擎变量。
CURLOPT_SSLENGINE_DEFAULT string 用来做非对称加密操作的变量。
CURLOPT_RANDOM_FILE string 指定一个用来生成 SSL 随机数种子的文件名。
CURLOPT_EGDSOCKET string Like CURLOPT_RANDOM_FILE, except a filename to an Entropy Gathering Daemon socket。
SSL
选项
CURLOPT_SSL_FALSESTART bool 是否开启 TLS False Start (一种 TLS 握手优化方式),默认TRUE;  (curl 7.42.0, PHP 7.0.7以上版本) 
CURLOPT_SSL_CIPHER_LIST string 一个SSL的加密算法列表,例如RC4-SHA和TLSv1都是可用的加密列表。
CURLOPT_SSL_OPTIONS integer 设置SSL行为选项,可以是:
  CURLSSLOPT_ALLOW_BEAST: do not attempt to use any workarounds for a security flaw in the SSL3 and TLS1.0 protocols. 
  CURLSSLOPT_NO_REVOKE:disable certificate revocation checks for those SSL backends where such behavior is present.
(curl 7.25.0, PHP 7.0.7以上版本)
CURLOPT_SSL_VERIFYHOST integer 【常用】可能的值:
0 :为不检查名称(默认);
1 :检查服务器SSL证书中是否存在一个公用名(common name)(curl 7.28.1以下版本才支持);
2 :会检查公用名是否存在,并且是否与提供的主机名匹配。 
CURLOPT_SSL_ENABLE_ALPN bool 是否禁用SSL握手中的 ALPN (如果SSL后端的libcurl内建支持) 用于协商到http2,默认为FALSE;  (curl 7.36.0, PHP 7.0.7以上版本)
CURLOPT_SSL_ENABLE_NPN bool 是否禁用SSL握手中的 NPN(如果 SSL 后端的 libcurl 内建支持),用于协商到 http2,默认为FALSE;  (curl 7.36.0, PHP 7.0.7以上版本)
CURLOPT_SSLVERSION integer 指定SSL版本,CURL_SSLVERSION_DEFAULT (0), CURL_SSLVERSION_TLSv1 (1), CURL_SSLVERSION_SSLv2 (2), CURL_SSLVERSION_SSLv3 (3), CURL_SSLVERSION_TLSv1_0 (4), CURL_SSLVERSION_TLSv1_1 (5) , CURL_SSLVERSION_TLSv1_2 (6) 中的其中一个,最好不要设置此选项,使用默认值即可,设置为 2 或 3 比较危险,在 SSLv2 和 SSLv3 中有弱点存在。
CURLOPT_CERTINFO bool 是否将在安全传输时输出SSL证书信息到 STDERR,默认为TRUE,需要设置CURLOPT_VERBOSE选项为TRUE才有效; (curl 7.19.1, PHP 5.3.2以上版本)
SSH
选项
CURLOPT_SSH_PRIVATE_KEYFILE string 指定ssh私钥文件,如果未设置,默认为$HOME/.ssh/id_dsa;(curl 7.16.1以上版本)
CURLOPT_SSH_PUBLIC_KEYFILE string 指定ssh公钥文件,如果未设置,默认为$HOME/.ssh/id_dsa.pub;(curl 7.16.1以上版本)
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 string 远程主机公钥(public key) 的 MD5 校验值,有32位16进制组成,在不匹配的时候curl拒绝连接,此选项仅用于 SCP 和 SFTP 的传输;(curl 7.17.1以上版本)
CURLOPT_SSH_AUTH_TYPES integer 一个或者多个有位掩码"|"连接的值,包含如下: CURLSSH_AUTH_PUBLICKEY、 CURLSSH_AUTH_PASSWORD、 CURLSSH_AUTH_HOST、 CURLSSH_AUTH_KEYBOARD,或者设置成CURLSSH_AUTH_ANY让curl自己选择; (curl 7.16.1以上版本)
FTP CURLOPT_FTPPORT string 这个值将被用来获取供FTP"PORT"指令所需要的IP地址,"PORT" 指令告诉远程服务器连接到我们指定的IP地址,这个字符串可以是纯文本的IP地址、主机名、一个网络接口名(UNIX下)或者只是一个'-'来使用默认的 IP 地址。 
CURLOPT_FTPSSLAUTH integer FTP验证方式:CURLFTPAUTH_SSL (首先尝试SSL)、CURLFTPAUTH_TLS (首先尝试TLS)、CURLFTPAUTH_DEFAULT (让curl自行决定)。(curl 7.12.2以上版本)。
CURLOPT_FTP_FILEMETHOD integer 告诉curl使用哪种方式来获取 FTP(s) 服务器上的文件。可能的值有: CURLFTPMETHOD_MULTICWD、 CURLFTPMETHOD_NOCWD 和 CURLFTPMETHOD_SINGLECWD。(curl  7.15.1,PHP 5.3.0以上版本)。
CURLOPT_TRANSFERTEXT bool FTP是否使用使用ASCII模式传输,默认为TRUE,对于LDAP,它检索纯文本信息而非 HTML,在 Windows 系统上,系统不会把 STDOUT 设置成二进制 模式。
CURLOPT_FTPASCII bool CURLOPT_TRANSFERTEXT的别名。
CURLOPT_FTPLISTONLY bool 是否只列出 FTP 目录的名字。
CURLOPT_FTPAPPEND bool 是否为追加写入文件,而不是覆盖。
CURLOPT_FTP_CREATE_MISSING_DIRS bool 是否自动创建不存在的ftp目录。
CURLOPT_QUOTE array 数组,一组先于 FTP 请求的在服务器上执行的FTP命令。 
CURLOPT_POSTQUOTE array 数组,在 FTP 请求执行完成后,在服务器上执行的一组array格式的 FTP 命令。
CURLOPT_TFTP_NO_OPTIONS bool 是否不发送 TFTP 的 options 请求。(curl  7.48.0 ,PHP 7.0.7 以上版本) 
CURLOPT_FTP_USE_EPRT bool TRUE 时,当 FTP 下载时,使用 EPRT (和 LPRT)命令, 设置为 FALSE 时禁用 EPRT 和 LPRT,仅仅使用PORT 命令。    
CURLOPT_FTP_USE_EPSV bool TRUE 时,在FTP传输过程中,回到 PASV 模式前,先尝试 EPSV 命令,设置为 FALSE 时禁用 EPSV。
断点
续传
CURLOPT_RANGE string 【常用】指定字节为单位的数据获取范围,可以用”N-M”的形式,多个范围用逗号分隔,如:"0-5,100-101"(仅HTTP GET有效)。
CURLOPT_RESUME_FROM integer 指定字节为单位的数据起始偏移量(仅HTTP GET有效)。
速率
限制
CURLOPT_LOW_SPEED_LIMIT integer 传输速度,每秒字节(bytes)数,根据CURLOPT_LOW_SPEED_TIME秒数统计是否因太慢而取消传输。
CURLOPT_LOW_SPEED_TIME integer 当传输速度小于CURLOPT_LOW_SPEED_LIMIT时(bytes/sec),PHP会判断是否因太慢而取消传输。    
CURLOPT_MAX_RECV_SPEED_LARGE integer 如果下载速度超过了此速度(以每秒字节数来统计) ,即传输过程中累计的平均数,传输就会降速到这个参数的值。默认不限速。 ( curl 7.15.5、PHP 5.4.0以上版本)
CURLOPT_MAX_SEND_SPEED_LARGE integer CURLOPT_MAX_SEND_SPEED_LARGE    如果上传的速度超过了此速度(以每秒字节数来统计),即传输过程中累计的平均数 ,传输就会降速到这个参数的值。默认不限速。  ( curl 7.15.5、PHP 5.4.0以上版本)
连接
选项
CURLOPT_MAXCONNECTS integer 允许的最大连接数量,达到限制时,会通过CURLOPT_CLOSEPOLICY决定应该关闭哪些连接。
CURLOPT_CONNECTTIMEOUT integer 在尝试连接时等待的秒数,设置为0,则无限等待。
CURLOPT_CONNECTTIMEOUT_MS integer 在尝试连接时等待的毫秒数,设置为0,则无限等待。
CURLOPT_TIMEOUT integer 允许curl数执行的最长秒数。
CURLOPT_TIMEOUT_MS integer 允许curl数执行的最长毫秒数。
CURLOPT_EXPECT_100_TIMEOUT_MS integer 超时预计: 100毫秒内的 continue 响应 默认为 1000毫秒。(curl 7.36.0、PHP 7.0.7以上版本)
CURLOPT_DNS_USE_GLOBAL_CACHE bool 是否开启DNS缓存,默认TRUE。
CURLOPT_DNS_CACHE_TIMEOUT integer 设置DNS在内存中缓存的时间,默认为120秒。
响应
选项
CURLOPT_BINARYTRANSFER bool 设置CURLOPT_RETURNTRANSFER 是否以原生的(Raw)数据格式返回。 从 PHP 5.1.3 开始,此选项不再有效,永远以原生数据格式返回。
CURLOPT_RETURNTRANSFER bool 【常用】将curl_exec()获取的信息以字符串返回,而不是直接输出。
CURLOPT_TIMECONDITION integer 设置如何对待CURLOPT_TIMEVALUE的时间。
  CURL_TIMECOND_IFMODSINCE(默认):仅在页面CURLOPT_TIMEVALUE之后修改,才返回页面,没有修改则返回"304 Not Modified"头。
如果设置了CURLOPT_HEADER为TRUE,CURL_TIMECOND_IFUNMODSINCE则起相反的效果。 
CURLOPT_TIMEVALUE integer 从1970年1月1日开始的秒数时间戳,这个时间戳提供给CURLOPT_TIMECONDITION选项判断。


CURLOPT_HEADER bool 【常用】为TRUE时会将HTTP头/文件头信息作为数据输出。
CURLOPT_WRITEHEADER stream 将响应头信息的内容的写入到指定地方,如写入到文件,则传fopen()函数返回的流资源句柄。
CURLOPT_HEADERFUNCTION function 【常用】设置一个回调函数来处理响应头信息,此函数必须包含两个参数,参数一为curl的资源句柄,参数二为curl传入的响应头信息,函数必须返回参数二的长度,用来告诉curl成功接收到了传入头信息;
CURLINFO_HEADER_OUT bool 是否追踪句柄的请求字符串。
响应
BODY
CURLOPT_NOBODY bool 【常用】设置为TRUE时,不会再输出BODY部分,同时METHOD变成HEAD;
CURLOPT_FILE stream 【常用】设置响应BODY要写入到指定地方,如写入到文件,则传fopen()函数返回的流资源句柄。
CURLOPT_WRITEFUNCTION function 【常用】设置一个回调函数来处理响应BODY信息,此函数必须包含两个参数,参数一为curl的资源句柄,参数二为curl传入的响应BODY信息,函数必须返回参数二的长度,用来告诉curl成功接收到了传入响应BODY信息;
CURLOPT_NOPROGRESS bool 是否关闭进度统计功能,默认为TRUE。
CURLOPT_PROGRESSFUNCTION function 【常用】设置一个回调函数来处理上传下载的进度,函数必须有五个参数:
参数一:是curl的资源句柄;
参数二:预计要下载的总字节(bytes)数;
参数三:目前下载的字节数;
参数四:预计传输中总上传字节数;
参数五:目前上传的字节数。
返回非零值将中断传输,并返回CURLE_ABORTED_BY_CALLBACK错误。只有设置 CURLOPT_NOPROGRESS 选项为 FALSE 时才会调用这个回调函数。
调试
选项
CURLOPT_VERBOSE bool 【常用】curl是否输出所有调试信息,写入到STDERR,或在CURLOPT_STDERR中指定的文件,默认为FALSE。
CURLOPT_STDERR stream 设置错误信息要写入到指定地方,如写入到文件,则传fopen()函数返回的流资源句柄,默认为STDERR。
CURLOPT_NOSIGNAL bool 是否忽略所有的cURL传递给PHP进行的信号。在 SAPI 多线程传输时此项被默认启用,所以超时选项仍能使用。(curl 7.10以上版本)
CURLOPT_FAILONERROR bool 设置为TRUE时,当 HTTP 状态码大于等于 400,TRUE 将将显示错误详情。 默认情况下将返回页面,忽略 HTTP 代码。    
CURLOPT_HTTP200ALIASES array 数组,HTTP 200 响应码数组,数组中的响应码被认为是正确的响应,而非错误。( curl 7.10.3以上版本)
CURLOPT_FILETIME bool 是否尝试获取远程文档中的修改时间信息。获取到的修改时间可以通过 curl_getinfo()函数查看。    
网络
选项
CURLOPT_INTERFACE string curl通过指定接口(interface)进行数据传输。可以是一个网口名、IP 地址或者是一个主机名。
CURLOPT_IPRESOLVE integer 允许curl选择想要解析的IP地址类别,只有在地址有多种ip类别的时候才能用,可以的值有: CURL_IPRESOLVE_WHATEVER(默认)、 CURL_IPRESOLVE_V4、 CURL_IPRESOLVE_V6 (curl 7.10.8以上版本)
CURLOPT_UNIX_SOCKET_PATH string 使用指定的 Unix 套接字作为连接。(cURL 7.40.0、PHP 7.0.7以上版本)
CURLOPT_FORBID_REUSE bool 在完成交互以后,是否强制断开连接,此链接将不能在连接池中重用。    
CURLOPT_FRESH_CONNECT   强制获取一个新的连接,而不是使用连接池中的链接。
CURLOPT_TCP_NODELAY bool 是否禁用 TCP 的 Nagle 算法。  
CURLOPT_TCP_FASTOPEN bool 是否开启TCP Fast Open。( curl 7.49.0、 PHP 7.0.7以上版本)
CURLOPT_SASL_IR bool 是否收到首包(first packet)后发送初始的响应(initial response)。(curl 7.31.10、PHP 7.0.7以上版本)
CURLOPT_STREAM_WEIGHT integer 设置 stream weight 数值 ( 1 和 256 之间的数字)。(curl 7.46.0、PHP 7.0.7以上版本) 
杂项 CURLOPT_CRLF bool 启用时将Unix的换行符转换成回车换行符。
CURLOPT_PIPEWAIT bool 是否等待 pipelining/multiplexing。(curl 7.43.0、PHP 7.0.7以上版本)
CURLOPT_CLOSEPOLICY integer CURLCLOSEPOLICY_* 中的一个。
CURLOPT_PINNEDPUBLICKEY string Set the pinned public key. The string can be the file name of your pinned public key. The file format expected is "PEM" or "DER". The string can also be any number of base64 encoded sha256 hashes preceded by "sha256//" and separated by ";".    Added in cURL 7.39.0. Available since PHP 7.0.7.
CURLOPT_PRIVATE string Any data that should be associated with this cURL handle. This data can subsequently be retrieved with the CURLINFO_PRIVATE option of curl_getinfo(). cURL does nothing with this data. When using a cURL multi handle, this private data is typically a unique key to identify a standard cURL handle.    Added in cURL 7.10.3.

file_get_contents

语法:

1
file_get_contents(path, include_path, context, start, max_length)
参数 描述
path 必需。规定要读取的文件,或者url。
include_path 可选。如果您还想在 include_path(在 php.ini 中)中搜索文件的话,请设置该参数为 '1'。
context 可选。规定文件句柄的环境。context 是一套可以修改流的行为的选项。若使用 NULL,则忽略。
start 可选。规定在文件中开始读取的位置。该参数是 PHP 5.1 中新增的。
max_length 可选。规定读取的字节数。该参数是 PHP 5.1 中新增的。

提示:该函数是二进制安全的。(意思是二进制数据(如图像)和字符数据都可以使用此函数写入)

GET请求

1
2
3
4
5
6
7
<?php
$data_get = array('a'=>1,'b'=>2);
$url = "http://192.168.101.111/index.php?" . http_build_query($data_get);

$res = file_get_contents($url);
echo $res;
?>

POST请求

结合stream_context_create函数构造资源流上下文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$data_post = array('a'=>1,'b'=>2);
$url = 'http://192.168.101.111/index.php';

$content = http_build_query($data_post); // 构造post请求数据
$content_length = strlen($content); // post请求体长度
$options = array( //http请求头
'http' => array(
'method' => 'POST',
'header' =>
"Content-type: application/x-www-form-urlencoded\r\n" .
"Content-length: $content_length\r\n",
'content' => $content
)
);
$context = stream_context_create($options); // 使用stream_context_create创建资源流上下文
$res = file_get_contents($url, false, $context); // 发出请求
echo $res;
?>

也可以通过这种方式来发出GET请求

fopen

fopen()函数打开文件或者URL。如果打开失败,本函数返回 FALSE。打开成功的话,会返回一个资源。

1
fopen(filename, mode, include_path, context)
参数 描述
filename 必需。规定要打开的文件或 URL。
mode 必需。规定您请求到该文件/流的访问类型。

可能的值:

  • "r" (只读方式打开,将文件指针指向文件头)
  • "r+" (读写方式打开,将文件指针指向文件头)
  • "w" (写入方式打开,清除文件内容,如果文件不存在则尝试创建之)
  • "w+" (读写方式打开,清除文件内容,如果文件不存在则尝试创建之)
  • "a" (写入方式打开,将文件指针指向文件末尾进行写入,如果文件不存在则尝试创建之)
  • "a+" (读写方式打开,通过将文件指针指向文件末尾进行写入来保存文件内容)
  • "x" (创建一个新的文件并以写入方式打开,如果文件已存在则返回 FALSE 和一个错误)
  • "x+" (创建一个新的文件并以读写方式打开,如果文件已存在则返回 FALSE 和一个错误)
include_path 可选。如果您还想在 include_path(在 php.ini 中)中搜索文件的话,请设置该参数为 '1'。
context 可选。规定文件句柄的环境。context 是一套可以修改流的行为的选项。

file_get_contents类似,GET请求直接构造url即可,POST请求需要使用stream_context_set_option()创建资源请求上下文。
需要注意的是,fopen()是创建一个资源流,若是网络请求,其内容可以通过stream_get_contents获取,其元信息可以通过stream_​get_​meta_​data获取。

GET请求

1
2
3
4
5
6
7
8
$data_get = array('a'=>1,'b'=>2);
$url = "http://192.168.101.111/index.php?" . http_build_query($data_get);

$fp = fopen($url, 'r');
$res = stream_get_contents($fp); // 获取返回内容
// fpassthru($fp); // 直接输出内容
fclose($fp);
echo $res;

POST请求
file_put_contents类似

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$data_post = array('a'=>1,'b'=>2);
$url = 'http://192.168.101.111/index.php';

$content = http_build_query($data_post); // 构造post请求数据
$content_length = strlen($content); // post请求体长度
$options = array( //http请求头
'http' => array(
'method' => 'POST',
'header' =>
"Content-type: application/x-www-form-urlencoded\r\n" .
"Content-length: $content_length\r\n",
'content' => $content
)
);
$context = stream_context_create($options); // 使用stream_context_create创建资源流上下文
$fp = fopen($url, 'r', false, $context); // 发出请求
$res = stream_get_contents($fp); // 获取返回内容
//fpassthru($fp); // 直接输出内容
fclose($fp); // 关闭资源

echo $res;
?>

readfile

读取一个文件,并写入到输出缓冲。

1
readfile(filename, include_path, context)

这个函数与file_get_contents类似,只是它是将返回内容直接输出,其返回值是读取到的字符长度。

file

把整个文件读入一个数组中。
数组中的每个元素都是文件中相应的一行,包括换行符在内。

1
file(path,include_path,context) 

readfile大致相同

fsockopen

打开一个网络连接或一个unix套接字连接,返回一个文件句柄。常用于socket编程

1
fsockopen($hostname[, $port=-1, &$errno, &$errstr, $timeout])
  • hostname 主机名
    如果安装了OpenSSL,那么你也许应该在你的主机名地址前面添加访问协议ssl://或者是tls://,从而可以使用基于TCP/IP协议的SSL或者TLS的客户端连接到远程主机。
  • port 端口号。
    如果对该参数传一个-1,则表示不使用端口,例如unix://。
  • errno
    如果errno的返回值为0,而且这个函数的返回值为 FALSE ,那么这表明该错误发生在套接字连接(connect())调用之前,导致连接失败的原因最大的可能是初始化套接字的时候发生了错误。
  • errstr 错误信息将以字符串的信息返回。
  • timeout 超时时间
    单位为秒。

HTTP请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$url = "http://192.168.101.111/index.php";
$data = array(
'a'=>'1',
'b'=>'2',
);

sock_get($url, $data);

function sock_get($url, $data)
{
$query_str = http_build_query($data);
$info = parse_url($url);
$fp = fsockopen($info["host"], 80, $errno, $errstr, 3);
if (!$fp)
die("$errstr ($errno)<br />\n");
$head = "GET ".$info['path']."?".$query_str." HTTP/1.1\r\n";
$head .= "Host: ".$info['host']."\r\n";
$head .= "\r\n";
$write = fputs($fp, $head);
while (!feof($fp))
{
$line = fread($fp,4096);
echo $line;
}
fclose($fp);
}

可以看到,通信数据全部都是由我们自己书写,所以POST请求也由我们自己构造

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$url = "http://192.168.101.111/index.php";
$data = array(
'a'=>'1',
'b'=>'2',
);
sock_post($url,$data);

function sock_post($url, $data)
{
$query_str = http_build_query($data);
$info = parse_url($url);
$fp = fsockopen($info["host"], 80, $errno, $errstr, 3);
if (!$fp)
die("$errstr ($errno)<br />\n");
$head = "POST ".$info['path']."?".$info["query"]." HTTP/1.1\r\n";
$head .= "Host: ".$info['host']."\r\n";
$head .= "Referer: http://".$info['host'].$info['path']."\r\n";
$head .= "Content-type: application/x-www-form-urlencoded\r\n";
$head .= "Content-Length: ".strlen(trim($query_str))."\r\n";
$head .= "\r\n";
$head .= trim($query_str);
$write = fputs($fp, $head);
while (!feof($fp))
{
$line = fread($fp,4096);
echo $line;
}
fclose($fp);
}

PHP 上下文(context)选项和参数

PHP中提供了多种上下文选项和参数,可用于所有的文件系统或数据流封装协议。

上下文(context)由stream_context_create()创建,选项可通过stream_context_set_option()设置,参数可通过stream_context_set_params()设置。

这里主要看HTTP Context 选项

可选项:

  • method string
    远程服务器支持的 GET,POST 或其它 HTTP 方法。
    默认值是 GET。
  • header string
    请求期间发送的额外 header。在此选项的值将覆盖其他值(诸如 User-agent:,Host: 和 Authentication:)。
  • user_agent string
    要发送的 header User-Agent: 的值。如果在上面的 header context 选项中没有指定 user-agent,此值将被使用。
    默认使用 php.ini 中设置的 user_agent
  • content string
    在 header 后面要发送的额外数据。通常使用POST或PUT请求。
  • proxy string
    URI 指定的代理服务器的地址。(e.g. tcp://proxy.example.com:5100).
  • request_fulluri bool
    当设置为 TRUE 时,在构建请求时将使用整个 URI
    (i.e. GET http://www.example.com/path/to/file.html HTTP/1.0)。
    虽然这是一个非标准的请求格式,但某些代理服务器需要它。
    默认值是 FALSE.
  • follow_location int
    跟随 Location header 的重定向。设置为 0 以禁用。
    默认值是 1。
  • max_redirects int
    跟随重定向的最大次数。值为 1 或更少则意味不跟随重定向。
    默认值是 20。
  • protocol_version float
    HTTP 协议版本。
    默认值是 1.0。
  • timeout float
    读取超时时间,单位为秒,用 float 指定(e.g. 10.5)。
    默认使用 php.ini 中设置的 default_socket_timeout
  • ignore_errors bool
    即使是故障状态码依然获取内容。
    默认值为 FALSE.
文章作者: Dar1in9
文章链接: http://dar1in9s.github.io/2020/04/26/php/php中常见可能产生ssrf漏洞的函数/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Dar1in9's Blog