TigerZF
🌐Español

B.3. Zend Framework 1.9

Al actualizar desde una versión de Zend Framework anterior a la 1.9.0 a cualquier versión 1.9, debe tener en cuenta las siguientes notas de migración.

B.3.1. Zend_File_Transfer

B.3.1.1. Validación de MimeType

Por razones de seguridad hemos tenido que desactivar el mecanismo de reserva por defecto de los validadores MimeType, ExcludeMimeType, IsCompressed e IsImage. Esto significa que si no se encuentran las extensiones fileInfo o magicMime, la validación siempre fallará.

Si necesita realizar la validación usando los campos HTTP proporcionados por el usuario, puede activar esta funcionalidad mediante el método enableHeaderCheck().

[Note] Consejo de seguridad

Debe tener en cuenta que confiar en los campos HTTP proporcionados por su usuario supone un riesgo de seguridad. Estos pueden modificarse fácilmente y podrían permitir a su usuario proporcionar un archivo malicioso.

Ejemplo B.1. Permitir el uso de los campos HTTP

// at initiation
$valid = new Zend_File_Transfer_Adapter_Http(array('headerCheck' => true);

// or afterwards
$valid->enableHeaderCheck();

B.3.2. Zend_Filter

Antes de la versión 1.9, Zend_Filter permitía el uso del método estático get(). A partir de la versión 1.9 este método ha sido renombrado a filterStatic() para ser más descriptivo. El antiguo método get() queda marcado como obsoleto.

B.3.3. Zend_Http_Client

B.3.3.1. Cambios en el almacenamiento interno de información de archivos subidos

En la versión 1.9 de Zend Framework, se ha producido un cambio en la forma en que Zend_Http_Client almacena internamente la información sobre los archivos que se van a subir, establecida mediante el método Zend_Http_Client::setFileUpload().

Este cambio se introdujo para permitir la subida de múltiples archivos con el mismo nombre de formulario, como un array de archivos. Puede encontrar más información sobre este asunto en este informe de error.

Ejemplo B.2. Almacenamiento interno de información de archivos subidos

// Upload two files with the same form element name, as an array
$client = new Zend_Http_Client();
$client->setFileUpload('file1.txt',
                       'userfile[]',
                       'some raw data',
                       'text/plain');
$client->setFileUpload('file2.txt',
                       'userfile[]',
                       'some other data',
                       'application/octet-stream');

// In Zend Framework 1.8 or older, the value of
// the protected member $client->files is:
// $client->files = array(
//     'userfile[]' => array('file2.txt',
                             'application/octet-stream',
                             'some other data')
// );

// In Zend Framework 1.9 or newer, the value of $client->files is:
// $client->files = array(
//     array(
//         'formname' => 'userfile[]',
//         'filename' => 'file1.txt,
//         'ctype'    => 'text/plain',
//         'data'     => 'some raw data'
//     ),
//     array(
//         'formname' => 'userfile[]',
//         'filename' => 'file2.txt',
//         'formname' => 'application/octet-stream',
//         'formname' => 'some other data'
//     )
// );

Como puede ver, este cambio permite el uso del mismo nombre de elemento de formulario con más de un archivo; sin embargo, introduce un cambio sutil de compatibilidad con versiones anteriores que conviene tener en cuenta.

B.3.3.2. Obsolescencia de Zend_Http_Client::_getParametersRecursive()

A partir de la versión 1.9, el método protegido _getParametersRecursive() ya no es utilizado por Zend_Http_Client y queda obsoleto. Su uso provocará que PHP emita un mensaje E_NOTICE.

Si extiende Zend_Http_Client y llama a este método, debería considerar el uso del método estático Zend_Http_Client::_flattenParametersArray() en su lugar.

De nuevo, dado que _getParametersRecursive() es un método protegido, este cambio solo afectará a los usuarios que extiendan Zend_Http_Client.

B.3.4. Zend_Locale

B.3.4.1. Métodos obsoletos

Algunos métodos de traducción especializados han quedado obsoletos porque duplican un comportamiento ya existente. Tenga en cuenta que los métodos antiguos seguirán funcionando, pero se activará un aviso de usuario que describe la nueva llamada. Los métodos se eliminarán en la versión 2.0. Consulte la siguiente lista para conocer la llamada de método antigua y la nueva.

Tabla B.3. Lista de tipos de medida

Llamada antigua Llamada nueva
getLanguageTranslationList($locale) getTranslationList('language', $locale)
getScriptTranslationList($locale) getTranslationList('script', $locale)
getCountryTranslationList($locale) getTranslationList('territory', $locale, 2)
getTerritoryTranslationList($locale) getTranslationList('territory', $locale, 1)
getLanguageTranslation($value, $locale) getTranslation($value, 'language', $locale)
getScriptTranslation($value, $locale) getTranslation($value, 'script', $locale)
getCountryTranslation($value, $locale) getTranslation($value, 'country', $locale)
getTerritoryTranslation($value, $locale) getTranslation($value, 'territory', $locale)

B.3.5. Zend_View_Helper_Navigation

Antes de la versión 1.9, el helper de menú (Zend_View_Helper_Navigation_Menu) no renderizaba correctamente los submenús. Cuando onlyActiveBranch era TRUE y la opción renderParents era FALSE, no se renderizaba nada si la página activa más profunda se encontraba a una profundidad inferior a la de la opción minDepth.

Dicho de forma más sencilla; si minDepth se establecía en '1' y la página activa estaba en una de las páginas de primer nivel, no se renderizaría nada, como muestra el siguiente ejemplo.

Considere la siguiente configuración de contenedor:

<?php
$container = new Zend_Navigation(array(
    array(
        'label' => 'Home',
        'uri'   => '#'
    ),
    array(
        'label'  => 'Products',
        'uri'    => '#',
        'active' => true,
        'pages'  => array(
            array(
                'label' => 'Server',
                'uri'   => '#'
            ),
            array(
                'label' => 'Studio',
                'uri'   => '#'
            )
        )
    ),
    array(
        'label' => 'Solutions',
        'uri'   => '#'
    )
));

El siguiente código se utiliza en un script de vista:

<?php echo $this->navigation()->menu()->renderMenu($container, array(
    'minDepth'         => 1,
    'onlyActiveBranch' => true,
    'renderParents'    => false
)); ?>

Antes de la versión 1.9, el fragmento de código anterior no generaba ninguna salida.

Desde la versión 1.9, el método _renderDeepestMenu() en Zend_View_Helper_Navigation_Menu aceptará páginas activas a un nivel por debajo de minDepth, siempre que la página tenga hijos.

El mismo fragmento de código ahora generará lo siguiente:

<ul class="navigation">
    <li>
        <a href="#">Server</a>
    </li>
    <li>
        <a href="#">Studio</a>
    </li>
</ul>

B.3.6. Correcciones de seguridad a partir de la versión 1.9.7

Adicionalmente, los usuarios de la serie 1.9 pueden verse afectados por otros cambios a partir de la versión 1.9.7. Todas ellas son correcciones de seguridad que también tienen posibles implicaciones de compatibilidad con versiones anteriores.

B.3.6.1. Zend_Dojo_View_Helper_Editor

Se realizó un pequeño cambio en la serie 1.9 para modificar el uso por defecto del dijit Editor para que utilice etiquetas div en lugar de una etiqueta textarea; este último uso tiene implicaciones de seguridad, y el uso de etiquetas div es lo recomendado por el proyecto Dojo.

Con el fin de seguir permitiendo la degradación elegante, se añadió una nueva opción degrade al helper de vista; esto permitía a los desarrolladores usar opcionalmente una etiqueta textarea en su lugar. Sin embargo, esto exponía a las aplicaciones desarrolladas con dicho uso a vectores de XSS. En la versión 1.9.7, hemos eliminado esta opción. La degradación elegante sigue estando soportada, no obstante, mediante una etiqueta noscript que incluye una textarea. Esta solución resuelve todos los problemas de seguridad.

La conclusión es que si estaba utilizando la marca degrade, esta simplemente se ignorará a partir de ahora.

B.3.6.2. Zend_Filter_HtmlEntities

Para utilizar por defecto una codificación de caracteres más segura, Zend_Filter_HtmlEntities ahora usa por defecto UTF-8 en lugar de ISO-8859-1.

Adicionalmente, dado que el mecanismo real trata con codificaciones de caracteres y no con conjuntos de caracteres, se han añadido dos nuevos métodos, setEncoding() y getEncoding(). Los métodos anteriores setCharSet() y setCharSet() ahora están obsoletos y actúan como proxy hacia los nuevos métodos. Por último, en lugar de usar los miembros protegidos directamente dentro del método filter(), estos miembros se obtienen a través de sus accesores explícitos. Si estaba extendiendo el filtro anteriormente, revise su código y sus pruebas unitarias para asegurarse de que todo sigue funcionando correctamente.

B.3.6.3. Zend_Filter_StripTags

Zend_Filter_StripTags contiene una marca, commentsAllowed, que, en versiones anteriores, permitía incluir opcionalmente en una lista blanca los comentarios HTML en el texto HTML filtrado por la clase. Sin embargo, esto exponía al código que activaba esta marca a ataques de XSS, en particular en Internet Explorer (que permite especificar funcionalidad condicional mediante comentarios HTML). A partir de la versión 1.9.7 (y aplicado retroactivamente a las versiones 1.8.5 y 1.7.9), la marca commentsAllowed ya no tiene ningún efecto, y todos los comentarios HTML, incluidos aquellos que contienen otras etiquetas HTML o comentarios anidados, se eliminarán de la salida final del filtro.