$ПОСТ-Значение, Получающее Плюс Знаки Удалены
Мы передаем открытый ключ 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"
Есть идеи, из-за чего удаляются знаки плюс?
4 answers
+
в URL-адресах интерпретируется большинством серверов как закодированное пространство (например, %20
).
Вам нужно закодировать его, как %2B
. Вместо использования -d/--data
используйте параметр cURL --data-urlencode
[ мужской локон] чтобы сделать это. Это было добавлено в curl
в январе 2009[ освобождение], таким образом, старые системы, которые не были обновлены, могут не поддерживать его.
PHP-х rawurlencode
[ документы php] выполняет ту же функцию.
И когда данные доступ к нему осуществляется с другой стороны (сервер), он уже автоматически декодируется.
Так что rawurldecode
[ документы php] не требуется в коде PHP, это только все испортит.
Вы должны передать строку с соответствующим URL-адресом в аргумент данных для curl. Вы можете использовать онлайн-кодировщик URL для одноразовых ситуаций.
У вас включены волшебные кавычки?
Вот существующий вопрос, который затрагивает аналогичную проблему: Почему переменные $_POST экранируются в PHP?
Вам также необходимо кодировать значения post в URL-адресе, даже если они не попадают непосредственно в URL-адрес, как значение get.
Вы также можете рассмотреть возможность использования base64encode
вместо urlencode
. Иногда urlencode/decode
будет делать неожиданные вещи, хотя я думаю, что это сработает и для вас в этом случае.