Frage

UPDATE (Lösung)

Da dieser Beitrag anständige Menge an Aufmerksamkeit zu bekommen scheint, ich möchte Sie wissen lassen, dass die Lösung einen richtige enctype (Inhaltstyp) Parameter in der <FORM> Erklärung zu schaffen, endeten als. Sie müssen den Wert auf multipart/form-data Codierung zu verhindern, die sonst mit dem Standard enctype von application/x-www-form-urlencoded nehmen würde. Ein kleiner Auszug unten von Formularen in HTML-Dokumenten bei w3.org:

  

Der Inhaltstyp   "Application / x-www-form-urlencoded" ist   ineffizient für das Senden von großen   Mengen von binären Daten oder Text   mit Nicht-ASCII-Zeichen. Das   Content-Typ "multipart / form-data"   sollte für die Einreichung der Formulare verwendet werden,   , Das enthält Dateien, Nicht-ASCII-Daten,   und binäre Daten.

Und hier ist die richtige Form Deklaration:

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

Ausgangsfrage

Ich arbeite auf einem Formular Spam-Schutz-Klasse, die im Wesentlichen Form Feldnamen mit einem verschlüsselten Wert mit mcrypt ersetzt. Das Problem dabei ist, dass mcrypt Verschlüsselung ist nur alphanumerische Zeichen beschränkt, die Formularfelder ungültig machen würde. der Code Da unten, können Sie denken, der aus irgendeinem Grund, warum ich Probleme mit würde die Werte der bereits verschlüsselten Array zu entschlüsseln?

/**
 * 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;
}

Ich mache später einen Anruf ein verstecktes Formularelement der Wert Einstellung mit:

base64_encode(serialize(self::$encrypted))

Im Wesentlichen das verborgene Feld enthält ein Array aller Formularfelder, die mit ihrem verschlüsselten Wert verschlüsselt wurden. Das ist so, ich weiß, welche Felder müssen im Backend entschlüsselt werden. Nach dem Formulareinreichung wird dieses Feld auf dem Back-End mit dem folgenden Code analysiert:

    // 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;

Meine Versuche, die verschlüsselten Feldschlüssel zu entschlüsseln scheitern. Es ist einfach einen neuen verstümmelte Schlüssel in der $_POST Array erstellen. Meine Vermutung ist, dass entweder base64_encoding oder serialization Zeichen aus dem $encrypted_data abgetrieben. Könnte jemand überprüfen, ob dies der Täter ist und ob es irgendwelche alternativen Methoden für die Codierung Form Schlüssel?

War es hilfreich?

Lösung

Also habe ich den Code, und modifizierte es ein wenig so, dass ich das Element einer Post-Anforderung entfernen und Ihre Funktion scheint gut zu funktionieren. Wenn Sie den Code nehme ich geschrieben und erstellen Sie ein Skript mit ihm, sollte es in der cli laufen und Sie werden seine Verschlüsselungs- / Entschlüsselungs die Felder korrekt sehen. Dies würde bedeuten, dass die Post-Anforderung ist, wie einige der verschlüsselten / serialisierte / codierten Daten entstellend. Wenn ein Framework, würde ich mehr in schauen, wie es behandelt den Post-Array, wie es Ihre Schlüssel zu verändern könnte / Wert verursacht sie nicht bis entsprechen. Der Code, den Sie auf dem Laufenden scheint in Ordnung.

<?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";
    }
    ?>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top