Intereting Posts

Исключение значения переменной из физической памяти в PHP

Общий вопрос: возможно ли удалить значение переменной String из физической памяти после того, как эта переменная не установлена ​​в PHP?

Проблема возникла из-за определенных требований стандартов безопасности (не должно быть никакого способа сбросить данные из памяти на диск при обработке некоторых важных данных). В разделе « Является ли память зашифрованной? » Нет хорошего способа шифрования данных в памяти.

Таким образом, при отмене строковой переменной в PHP вы не можете точно сказать, что данные в памяти были перезаписаны. Та же история об установке нового значения переменной.

Таким образом, мне интересно, можно ли стереть значение переменной из памяти без изменения основного кода метода unset ?

Прежде всего, я не уверен, что уничтожение строки соответствует требованиям безопасности, которые вы описали, поскольку теоретически можно было бы сбрасывать память до того, как строка будет стерта в любом случае. Но это невозможно, так как вы не можете обрабатывать данные, не имея их в памяти.

В любом случае, если вы хотите, чтобы строка была стерта, я думаю, что единственный способ сделать это в PHP – это перебрать строку и изменить каждый символ: помните, что содержимое памяти не исчезает до перезаписывания, даже если у вас есть ссылки на переменную и PHP GC не выполняются.

Я считаю, что это сработает:

 for( $i=0; $i < strlen($str); $i++ ) $str[$i] = 'x'; 

Провели ли некоторые тесты с PHP 5.6:

 <?php $cc = 'AAAABBBBCCCCDDDD'; #v1: unset($cc); #v2: $cc=null; #v3: for( $i=0; $i < strlen($cc); $i++ ) $cc[$i] = 'x'; sleep(500); // enough time for taking script pid and run the memory dump ?> 

Пробовал каждую версию вышеуказанного скрипта (# v1 enabled, # v2 enabled, # v3 enabled); Сбросьте память процесса (см. https://serverfault.com/a/408929/374467 ), а строка «AAAABBBBCCCCDDDD» всегда отображается в двоичных файлах, сгенерированных (которые содержат память процесса). Также проверяется, когда значение $ cc отправляется как аргумент командной строки ($ argv). Тот же результат.

На сегодняшний день я не нашел надежного способа сделать это в PHP.

Итак, насколько я понял, проблема заключается не в использовании unset() или сборщике мусора PHP, а в том, чтобы убедиться, что используемая память на самом деле очищена на физическом уровне?

Простой способ – просто установите его на нуль перед отключением (или любым другим значением, если на то пошло). Смотрите, что лучше освобождает память с помощью PHP: unset () или $ var = null

Твердый и надежный способ состоял бы в том, чтобы распределить всю память php с помощью мусора, чтобы убедиться, что она перезаписана, но я не уверен, что виртуальная память зафиксирована на предопределенном диапазоне или изменения, основанные на потребностях процесса.