$_POST 值删除加号

Posted

技术标签:

【中文标题】$_POST 值删除加号【英文标题】:$_POST Value Geting Plus Signs Removed 【发布时间】:2022-01-15 01:23:30 【问题描述】:

我们使用 POST 通过 API 调用传递 ssh 公钥。奇怪的是,当我们在 php 中获取值时,加号 (+) 被完全去掉了。显然,这不起作用,因为它会更改公钥的值。

查看以下原始 curl 请求:

curl "https://api.example.com/v1/keys" -X POST -d "key=ssh-dss AAAAB3NzaC1kc3MAAACBAOLsyYuyI0/3/UjajY8ljdgkAV2k9jZxjlVGWvHa9afMuO7DqsOcu0o4e5D9TPScsO5XrgTrmcXHkOtM54fOPdXSzonWOXUIn1XEumdHDlv9YRZTCW/A9qajhPR67y+92su9AqeGXI0/q3BXZsZcC1nr1NjgSiz++r+YZFVWfQsNAAAAFQCYBf0KXVLfYUE6cOTbWnBWn5Py9QAAAIEA3WAkAwhR7fhwWpxuwxNnsB8NXwsEs2NWiOaiMu3dmDWyqGRjfOYUchoLelBMpv4oLTZuaGW4/DCWfdh6pgrxs39MXf+FdTir8KeHIIoXEdcXpWqnuyNBdXn5XNY54vc1eMkbm4q3D1i3+IMhNAURasdvFRoDzgH9s68Ik3P5HrMAAACAab+CiT010wXMzv+6v+oWcRWbxhGou/ND+K2QGU1kAW+KuUGmhOgB6XPka7iEsIeA/+Ojh+OiNedFZlJAZq1jarew106YCOrUlbtDk7pAAUJQhIhKFhpNE0UhLRBWOF9LpjDwWu55dlrfLURE32TuMx/NsazWVypbzJqy48d2sg8= justin@mbpro"

但是,当我们 var_dump() 在 PHP 中取出 $_POST['key'] 的值时,它是:

string(601) "ssh-dss AAAAB3NzaC1kc3MAAACBAOLsyYuyI0/3/UjajY8ljdgkAV2k9jZxjlVGWvHa9afMuO7DqsOcu0o4e5D9TPScsO5XrgTrmcXHkOtM54fOPdXSzonWOXUIn1XEumdHDlv9YRZTCW/A9qajhPR67y 92su9AqeGXI0/q3BXZsZcC1nr1NjgSiz  r YZFVWfQsNAAAAFQCYBf0KXVLfYUE6cOTbWnBWn5Py9QAAAIEA3WAkAwhR7fhwWpxuwxNnsB8NXwsEs2NWiOaiMu3dmDWyqGRjfOYUchoLelBMpv4oLTZuaGW4/DCWfdh6pgrxs39MXf FdTir8KeHIIoXEdcXpWqnuyNBdXn5XNY54vc1eMkbm4q3D1i3 IMhNAURasdvFRoDzgH9s68Ik3P5HrMAAACAab CiT010wXMzv 6v oWcRWbxhGou/ND K2QGU1kAW KuUGmhOgB6XPka7iEsIeA/ Ojh OiNedFZlJAZq1jarew106YCOrUlbtDk7pAAUJQhIhKFhpNE0UhLRBWOF9LpjDwWu55dlrfLURE32TuMx/NsazWVypbzJqy48d2sg8= justin@mbpro"

知道是什么导致加号被删除吗?

【问题讨论】:

【参考方案1】:

+ 加上表单数据中的字符被某些服务器解释为空格字符。

您可以通过将表单数据中的加号字符编码为%2B 来避免这种情况。不要使用-d/--data,而是使用cURL's --data-urlencode parameter 来执行此操作。

PHP's rawurlencode function 可以在您构建传出请求时执行相同的编码。但是,当服务器上的 PHP 脚本访问传入的响应数据时,它已经被自动解码,因此您不需要(也不应该)自己调用 rawurldecode

【讨论】:

小心,并非在所有情况下 + 都被编码为 %20。 ***.com/questions/996139/… 是的,这是个问题,我们不想要求用户在将公钥复制并粘贴到 and API 并用 %2B 替换加号时手动检查公钥。我们可以在后端破解它,并用 + 号替换空格,因为我们知道 ssh 公钥永远不会有空格? 不要使用-d,而是尝试使用--data-urlencode。我认为它应该为你处理这个问题。 --data-urlencode 有效,只需在文档中指定他们必须使用该标志,而不是 -d【参考方案2】:

您必须将适当的 URL 编码字符串传递给 curl 的数据参数。对于一次性情况,您可以使用online URL encoder。

【讨论】:

【参考方案3】:

你有打开魔术引号吗?

这是一个解决类似问题的现有问题: Why are $_POST variables getting escaped in PHP?

您还需要对 post 值进行 url 编码,即使它们不像 get 值那样直接进入 URL。

【讨论】:

【参考方案4】:

您可能还想考虑使用base64encode 而不是urlencode。有时urlencode/decode 会做意想不到的事情,但我认为在这种情况下它也对你有用。

http://php.net/manual/en/function.base64-encode.php

【讨论】:

以上是关于$_POST 值删除加号的主要内容,如果未能解决你的问题,请参考以下文章

AJAX POST 和加号 (+) -- 如何编码?

如何从 php 中的 JSON 对象数组中删除值?

同时删除和插入记录 PHP

删除数组的特定值

如何使用 curl 在弹性搜索中删除 arraylist 值?

php删除$ _POST上的键[重复]