【问题标题】:$_POST Value Geting Plus Signs Removed$_POST 值删除加号
【发布时间】: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"

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

【问题讨论】:

    标签: php post curl


    【解决方案1】:

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

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

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

    【讨论】:

    • 小心,并非在所有情况下 + 都被编码为 %20。 stackoverflow.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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-21
          • 2010-11-15
          • 2023-03-04
          • 2017-09-11
          • 1970-01-01
          • 2018-08-31
          • 2023-03-03
          相关资源
          最近更新 更多