$ПОСТ-Значение, Получающее Плюс Знаки Удалены


Мы передаем открытый ключ ssh через вызов API, используя POST. Странно то, что когда мы получаем значение в PHP, знаки плюс (+) полностью удаляются. Очевидно, что это не работает, так как изменяет значение открытого ключа.

Смотрите следующий необработанный запрос на завиток:

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() выводим значение $_POST['ключ'] в нашем PHP, это:

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"

Есть идеи, из-за чего удаляются знаки плюс?

Author: Justin, 2011-09-14

4 answers

+ в URL-адресах интерпретируется большинством серверов как закодированное пространство (например, %20).

Вам нужно закодировать его, как %2B. Вместо использования -d/--data используйте параметр cURL --data-urlencode[ мужской локон] чтобы сделать это. Это было добавлено в curl в январе 2009[ освобождение], таким образом, старые системы, которые не были обновлены, могут не поддерживать его.

PHP-х rawurlencode[ документы php] выполняет ту же функцию.

И когда данные доступ к нему осуществляется с другой стороны (сервер), он уже автоматически декодируется.
Так что rawurldecode[ документы php] не требуется в коде PHP, это только все испортит.

 23
Author: Jeremy Banks, 2016-03-25 18:16:47

Вы должны передать строку с соответствующим URL-адресом в аргумент данных для curl. Вы можете использовать онлайн-кодировщик URL для одноразовых ситуаций.

 0
Author: Kerrek SB, 2011-09-14 02:08:08

У вас включены волшебные кавычки?

Вот существующий вопрос, который затрагивает аналогичную проблему: Почему переменные $_POST экранируются в PHP?

Вам также необходимо кодировать значения post в URL-адресе, даже если они не попадают непосредственно в URL-адрес, как значение get.

 -1
Author: Matt Crinklaw-Vogt, 2017-05-23 12:18:04

Вы также можете рассмотреть возможность использования base64encode вместо urlencode. Иногда urlencode/decode будет делать неожиданные вещи, хотя я думаю, что это сработает и для вас в этом случае.

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

 -1
Author: Homer6, 2018-07-18 14:44:14