mcrypt2つの方法で暗号化の問題をbase64エンコーディングおよび直列化
-
19-09-2019 - |
質問
UPDATE(溶液)
この投稿へといたる、すべての量の注意思わかりやすく皆さんにお届けすることを解決できずに終適切に行 enctype
(コンテンツタイプ)パラメータの <FORM>
宣言です。設定にしておく必要がある値 multipart/form-data
防止へのエンコードがその場のデフォルトのenctypeの application/x-www-form-urlencoded
.小さな抜粋したも下から 形式HTML文書 時w3.org:
のコンテンツタイプ "application/x-www-form-urlencoded"が 非効率な送大 量のバイナリデータはテキスト を含む非ASCII文字です。の コンテンツタイプ"multipart/form-data" 用いるべきである提出書 を含むファイル、非ASCIIデータ バイナリデータです。
こちらは適切な形で宣言:
<FORM method="POST" action="/path/to/file/" name="encryptedForm" enctype="multipart/form-data">
初期の質問
した形で迷惑メール保護クラスは本質的に置き換えフォームフィールド名と暗号化された値を使用mcrypt.ここではそのmcrypt暗号化だけに限定せず半角英数字という形を無効にする。 さらに以下のコードであると考えまのたいへんお世話になりました。いる問題の解除を行うの価値を既に暗号化された配列?
/**
* 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;
}
後か電話をかける設定の隠れフォーム要素の値を用い:
base64_encode(serialize(self::$encrypted))
基本的には、隠しフィールドを含むすべての配列形成した暗号化と暗号化された値です。このように知っている分野で必要とする復号の英語版をご覧下さい意書のご提出はこの分野が解析され、バックエンドは次のコード:
// 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;
私の試みが復号暗号化されたフォームフィールドのキーにない.では新しい文字化ける $_POST
配列に格納します。私の推測ではのいずれか base64_encoding
または serialization
は剥離字から $encrypted_data
. が誰かを証明することが原因とがあるかどうかは、代替方法エンコード形式のキー?
解決
んでしたコードを変更することにしているようにな要素を削除しますのpostリクエストを行うよう、機能のようだ。まれに下記のようなコードの掲載をスクリプトで、このcliをつけてくださいその暗号化/復号化の分野を修正。こうしているという意味での請求はどのようgarblingの暗号化/直列化された/符号化されたデータです。を使用する場合は、枠組み、いくつか取り扱いの配列から変更のおのキー/値が一致しない。このコードで掲載しています。
<?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";
}
?>