为什么cURL在POST时解码我的URL编码值?

时间:2016-09-26 11:48:43

标签: php curl

当使用cURL通过POST发送数据时,如果该数据字符串是URL编码的,或者部分数据是URL编码的,则cURL会在发送数据时自动对数据进行解码。

在PHP中使用cURL或直接在命令行中使用时会发生这种情况。

我已经使用2种不同版本的cURL进行了测试:7.19和7.49。两者都表现出相同的行为

我已经从两个不同的服务器发送了cURL请求,认为服务器的配置方式对此有所影响,但结果是一样的。

以下是我用于测试的简单PHP cURL请求:

$ua = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.A.B.C Safari/525.13';

$data = "https%3A%2F%2Fexample.com%3A8081%2Ftemoignez%3FQid%3D%26"       

$ch = curl_init( "https://example.com/test/webhook.php" );
curl_setopt($ch, CURLOPT_USERAGENT, $ua);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "payload=".$data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec( $ch );

即使初始字符串是URL编码,数据也会被解码。

我通过使用PHP将POST数据转储到磁盘上的文件来检索数据。

这是正常的吗?知道是什么原因引起的吗?

1 个答案:

答案 0 :(得分:2)

这里有两个不同的断言:

  

cURL会在发送数据时自动解码数据

...

  

我只是在检索后将POST数据转储到文件中

接收时,PHP会自动解码数据。它不会在发送后解码!

这与其他值的行为集成在一起,比如cookie数据,post和get变量,头文件信息,例如referrer,......收到后会自动解码所有内容,因为预计会发送编码。

如果要查看通过线路发送的确切数据,请在端口80上使用ngrep之类的工具来嗅探TCP HTTP流量。