Pregunta

ACTUALIZACIÓN (solución)

Desde este post parece tener buena cantidad de atención, me gustaría hacerle saber que la solución terminó siendo para proporcionar un parámetro enctype adecuada (tipo de contenido) en la declaración <FORM>. Debe establecer el valor a multipart/form-data para evitar la codificación que de lo contrario llevará a cabo mediante el enctype por defecto de application/x-www-form-urlencoded. Un pequeño extracto a continuación de Formas en los documentos HTML a w3.org:

  

El tipo de contenido   "Application / x-www-form-urlencoded" es   ineficiente para el envío de grandes   cantidades de datos binarios o de texto   que contiene caracteres no ASCII. los   tipo de contenido "multipart / form-data"   se debe utilizar para la presentación de formas   que contienen archivos, datos no ASCII,   y de datos binarios.

Y aquí es la declaración de la forma apropiada:

<FORM method="POST" action="/path/to/file/" name="encryptedForm" enctype="multipart/form-data">

PREGUNTA INICIAL

Estoy trabajando en una clase de protección de correo no deseado forma que sustituye esencialmente nombres de campos de formulario con un valor cifrado usando mcrypt. El problema con esto es que el cifrado mcrypt no se limita a sólo caracteres alfanuméricos, que pudieran invalidar los campos del formulario. Teniendo en cuenta el código de abajo, se puede pensar en ninguna razón por la que estaría teniendo problemas para descifrar los valores de la matriz ya encriptada?

/**
 * Two way encryption function to encrypt/decrypt keys with
 * the DES encryption algorithm.
 */
public static function encryption($text, $encrypt = true)
{
    $encrypted_data = '';
    $td = mcrypt_module_open('des', '', 'ecb', '');
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    if (mcrypt_generic_init($td, substr(self::$randomizer, 16, 8), $iv) != -1) {
        if ($encrypt) {
            // attempt to sanitize encryption for use as a form element name
            $encrypted_data = mcrypt_generic($td, $text);
            $encrypted_data = base64_encode($encrypted_data);
            $encrypted_data = 'i' . strtr($encrypted_data, '+/=', '-_.');
            self::$encrypted[] = $encrypted_data;
        } else {
            // reverse form element name sanitization and decrypt
            $text = substr($text, 1);
            $text = strtr($text, '-_.', '+/=');
            $text = base64_decode($text);
            $encrypted_data = mdecrypt_generic($td, $text);
        }
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
    }
    return $encrypted_data;
}

Más tarde me hacen que la configuración de una llamada valor de un elemento de formulario oculto usando:

base64_encode(serialize(self::$encrypted))

En esencia, el campo oculto contiene una matriz de todos los campos de formulario que fueron cifrados con su valor de cifrado. Esto es por lo que sé, que necesitan ser descifrados en el backend campos. Tras el envío de formularios este campo se analiza en el backend con el siguiente código:

    // load the mapping entry
    $encrypted_fields = $input->post('encrypted', '');
    if (empty($encrypted_fields)) {
        throw new AppException('The encrypted form field was empty.');
    }

    // decompress array of encrypted fields
    $encrypted_fields = @unserialize(base64_decode($encrypted_fields));
    if ($encrypted_fields === false) {
        throw new AppException('The encrypted form field was not valid.');
    }

    // get the mapping of encrypted keys to key
    $data = array();
    foreach ($_POST as $key => $val) {
        // if the key is encrypted, add to data array decrypted
        if (in_array($key, $encrypted_fields)) {
            $decrypted = self::encryption($key, false);
            $data[$decrypted] = $val;
            unset($_POST[$key]);
        } else {
            $data[$key] = $val;
        }
    }

    // merge $_POST array with decrypted key array
    $_POST += $data;

Mis intentos de descifrar el campo de forma encriptada teclas están fallando. Se trata simplemente de crear una nueva clave ilegible en la matriz $_POST. Mi conjetura es que, o bien base64_encoding o serialization es el paso de caracteres de la $encrypted_data. ¿Puede alguien verificar si este es el culpable y si hay métodos alternativos para claves del formulario de codificación?

¿Fue útil?

Solución

Así que tomé su código, y modifiqué un poco para que pueda retirar el elemento de una solicitud de correos y su función parece funcionar bien. Si se toma el código que he publicado y crear un guión con ella, se debe ejecutar en el CLI y verá su cifrar / descifrar los campos correctamente. Esto tendría que significar que la solicitud posterior es de alguna forma garbling los datos cifrados / codificados en serie /. Si se utiliza un marco, me gustaría ver más en la forma en que maneja la matriz posterior, ya que podría alterar sus claves / valores haciendo que no coinciden. El código que ha publicado parece estar bien.

<?php
    /**
     * Two way encryption function to encrypt/decrypt keys with
     * the DES encryption algorithm.
     */
    function encryption($text, $encrypt = true, &$encryptedFields = array())
    {
        $encrypted_data = '';
        $td = mcrypt_module_open('des', '', 'ecb', '');
        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        if (mcrypt_generic_init($td, substr('sdf234d45)()*5gf512/?>:LPIJ*&U%&^%NBVFYUT^5hfhgvkjtIUUYRYT', 16, 8), $iv) != -1) {
            if ($encrypt) {
                // attempt to sanitize encryption for use as a form element name
                $encrypted_data = mcrypt_generic($td, $text);
                $encrypted_data = base64_encode($encrypted_data);
                $encrypted_data = 'i' . strtr($encrypted_data, '+/=', '-_.');
                //self::$encrypted[] = $encrypted_data;
                $encryptedFields[] = $encrypted_data;
            } else {
                // reverse form element name sanitization and decrypt
                $text = substr($text, 1);
                $text = strtr($text, '-_.', '+/=');
                $text = base64_decode($text);
                $encrypted_data = mdecrypt_generic($td, $text);
            }
            mcrypt_generic_deinit($td);
            mcrypt_module_close($td);
        }
        return $encrypted_data;
    }

    $encryptedFields = array();

    // encrypt some form fields
    encryption('firstname', true, $encryptedFields);
    encryption('lastname', true, $encryptedFields);
    encryption('email_fields', true, $encryptedFields);

    echo "Encrypted field names:\n";
    print_r($encryptedFields);

    // create a usable string of the encrypted form fields
    $hiddenFieldStr = base64_encode(serialize($encryptedFields));

    echo "\n\nFull string for hidden field: \n";
    echo $hiddenFieldStr . "\n\n";


    $encPostFields = unserialize(base64_decode($hiddenFieldStr));

    echo "\n\nDecrypted field names:\n";
    foreach($encPostFields as $field)
    {
        echo encryption($field, false)."\n";
    }
    ?>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top