Почему некоторые символы не могут быть извлечены из переменных среды Linux / Bash в PHP? - PullRequest
0 голосов
/ 16 мая 2019

Я постараюсь сделать это как можно более коротким, не делая его полностью нечитаемым.

Я храню зашифрованные наборы данных в своей базе данных, используя реализацию openssl в PHP.

Вот кое-чтоаналогично тому, что я делаю:

$pw = 'nobody loves you like I do.';
$cm = 'aes-256-cbc-hmac-sha256';
$c_key = '-$k���۱�d��o��ּ)2�"�C�!{���"�pO�⌧Ӝ�A��)mL�ڡ��i����OP753D8⮩eÒ98u07ף�11�u�e';
$iv = '�w�[(32';
$sslpw = openssl_encrypt($pw, $cm, $c_key, $options=0, $iv);

Все значения, которые я заполняю $c_key и $iv, были сгенерированы с использованием openssl_random_pseudo_bytes()

Итак, подумавздесь нет проблем, я создал небольшой файл со всеми такими значениями, которые будут получены из переменных среды, например:

export PAXYZ_C_KEY='-$k���۱�d��o��ּ)2�"�C�!{���"�pO�⌧Ӝ�A��)mL�ڡ��i����OP753D8⮩eÒ98u07ף�11�u�e';
export PAXYZ_C_IV='�w�[(32'

Однако после того, как я поставил файл и прочитал их в своем PHP-скрипте, я потерялхорошие 50% каждой строки, даже если они строковые литералы.

Однако, если я установлю env var напрямую через командную строку, он установится просто отлично.Проблема заключается в том, чтобы поместить его в файл и установить в файле.Я даже не знаю, почему это будет иметь значение, но это имеет значение.

Если я все строго придерживаюсь PHP, никаких проблем с этими символами не возникает.

На каком уровне можноЯ даже диагностирую это?Кажется, не имеет значения, копирую и вставляю ли я в терминал или в редактор - результат тот же.Но на самом деле, это то, где мой опыт зашёл в тупик.

К сожалению, я уже проделал большую работу по шифрованию с моим текущим набором ключей - так что я не слишком горячо перешифрую все, еслиЯ не обязан.

1 Ответ

4 голосов
/ 16 мая 2019

Переменные среды являются строками C и не могут содержать нулевые байты. Случайные данные, такие как вывод openssl_random_pseudo_bytes(), часто будут содержать нулевые байты. Вам нужно будет закодировать выходные данные этих функций таким образом, чтобы гарантировать, что они не будут содержать нулевые байты; один простой способ сделать это будет использовать base64_encode() перед помещением их в переменные окружения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...