Новые книги

Слово криптография означает тайнопись.

Российская криптография имеет многовековую историю, начинающуюся с указов Петра I о «черных кабинетах». До середины 80-х годов XX века криптография в России использовалась только для военных, дипломатических и правительственных линий связи и была строго засекречена. Даже употребление слов «криптография», «шифры», «ключи к шифрам» в открытых публикациях было недопустимо. Но в мире быстро назревала потребность в гражданской криптографии, стремительно развивались информационные технологии, стали появляться компьютерные сети, Интернет, денежные электронные расчеты. Для этого требовались надежные и общедоступные криптографические методы защиты информации.

Была ли Россия готова к появлению гражданской криптографии? И да, и нет.

Да, потому что еще с советских времен в России существовала прекрасная криптографическая школа и высококлассные специалисты-криптографы, которые долгое время на равных конкурировали с американским Агентством Национальной Безопасности и обеспечивали гарантированную защиту военных, дипломатических и правительственных линий связи.

Нет, потому что синдром тотальной секретности всего, что касалось криптографии, восходил к сталинским временам и мало изменился за прошедшие десятилетия. А в подобных условиях очень хорошо себя чувствуют многочисленные чиновники от криптографии.

В 1992 году случился кризис: поток фальшивых авизо захлестнул Центральный Банк России и грозил обрушить всю финансовую систему. Потребовалась срочная помощь криптографов: в кратчайшие сроки создать, наладить и запустить в эксплуатацию систему криптографической защиты телеграфных и почтовых авизо в такой огромной структуре, как ЦБ РФ.

Эта задача была выполнена за три месяца – неимоверно короткий срок.

В России появился первый реальный пример гражданской криптографии.

О том, что представляла из себя советская криптографическая школа, о ее специалистах и начальниках, о царившей тогда в стране атмосфере, о том, как была создана система защиты для Центрального Банка России, и, наконец, о том, почему же в России так трудно пробивает себе дорогу гражданская криптография – в этой книге.
Словарь содержит более 12 000 терминов, понятий, обозначений, сокращений и аббревиатур, используемых в современном рекламном бизнесе, в том числе пришедших из смежных областей – из маркетинга и паблик рилейшнз, масс-медиа и интернет-дизайна, из психологии, социологии, права. В него вошли также выражения из профессионального жаргона рекламистов, «киношников», журналистов, полиграфистов.

Словарь предназначен для специалистов в сфере рекламы и ПР, представителей средств массовой информации, рекламных агентств и рекламодателей, а также для переводчиков, студентов и преподавателей дисциплин, связанных с рекламной деятельностью.

Работа с Аргументами, Передаваемыми по Ссылке

Учебник РНР
Назад Глава 33. Приём аргументов Вперёд

Работа с аргументами, передаваемыми по ссылке

Если ваша функция принимает передаваемые по ссылке аргументы, которые вы намереваетесь изменять, вы должны предпринять некоторые меры предосторожности.

Мы ещё не говорили, что при указанных обстоятельствах вы не имеете доступа для записи любого параметра функции назначения zval-контейнера, передаваемого (параметр) вам. Конечно, вы можете изменять любой zval-контейнер, который создали внутри вашей функции, но вы обязаны не изменять любые zvals, которые ссылаются на внутренние Zend-данные!

Мы обсудили только так называемый *_ex() API. Вы могли заметить, что API-функции, использованные нами, вызываются zend_get_parameters_ex(), вместо zend_get_parameters(), convert_to_long_ex() вместо convert_to_long(), etc. Функции *_ex() образуют так называемый новый "расширенный/extended" Zend API. Они дают незначительное увеличение скорости по сравнению со старым API, но предназначаются главным образом для предоставления доступа "только-для-чтения".

Поскольку Zend работает внутренне со ссылками, разные переменные могут ссылаться на одно значение. Доступ для записи в zval-контейнер требует, чтобы этот контейнер содержал изолированное значение, то есть значение, на которое нет ссылок из других контейнеров. Если бы на zval-контейнер имелись ссылки из других контейнеров и вы изменили бы zval, на который ссылаются, вы могли бы автоматически изменять содержимое других контейнеров, ссылаясь на данный zval (поскольку они просто указывали бы на изменённое значение и изменяли бы таким образом свои собственные значения).

zend_get_parameters_ex() не отслеживает такую ситуацию, а просто возвращает указатель на желаемые zval-контейнеры, независимо от того, состоят они из ссылок или нет. Соответствующая ему функция в традиционном API, zend_get_parameters(), немедленно проверяет значения по ссылкам. Если он обнаруживает ссылку, он создаёт новый изолированный zval-контейнер; копирует ссылочные данные в это вновь выделенное пространство; затем возвращает указатель на это новое изолированное значение.

Эта акция называется zvalseparation\сепарация zval (или zval separation). Поскольку *_ex() API не выполняет zval separation, он работает быстрее, отменяя за это же время доступ для записи.

Однако для изменения параметров доступ для записи необходим. Zend обрабатывает эту ситуацию специальным способом: При передаче параметра в функцию по ссылке, он выполняет автоматическую zval-сепарацию. Это означает, что всякий раз, когда вызываете функцию вроде этой в PHP, Zend автоматически будет гарантировать, что этот $parameter передаётся как изолированное значение с переводом его в состояние write-safe/безопасной записи:

my_function(&$parameter);

Но это не так в случае в регулярными параметрами! Все другие параметры, которые не передаются по ссылке, находятся в состоянии read-only/только-для-чтения.

Это требует, чтобы вы гарантировали, что вы реально работаете со ссылкой - иначе вы можете получить нежелательный результат. Для проверки передачи параметра по ссылке вы можете использовать макрос PZVAL_IS_REF. Этот макрос принимает zval* и проверяет, является он ссылкой или нет. Примеры даны в Листинге 9.6 и на Рисунке 9.9 (см. на CD-ROM полный исходник).

Рисунок 33-9. Листинг 9.6. Тестирование передачи параметра как ссылки
zval *parameter;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &parameter) == FAILURE)
    return;
}

/* проверить, передан ли параметр по ссылке */
if (!PZVAL_IS_REF(*parameter)) {
{
    zend_error(E_WARNING, "Parameter wasn't passed by reference");
    RETURN_NULL();
}

/* сделать изменения в параметре */
ZVAL_LONG(*parameter, 10);

Назад Оглавление Вперёд
Доступ к аргументам Вверх Гарантия безопасной записи для других параметров