2014-02-28 60 views
1

我正在使用jQuery AJAX为PHP文件传递变量。当encypted值经过PHP它的外观differenet从我在HTML DOM通过AJAX传递加密值返回不正确的值

这是它的外观在HTML DOM

<input type="hidden" name="meta" value="�!e�����"> 

的源代码

$profile_id = 1; 
    <input type="hidden" name="meta" id="meta" value="<?php echo encrypt($profile_id, ENCRYPTION_KEY); ?>"> 

我'正在使用此PHP函数生成上述加密值

function encrypt($pure_string, $encryption_key){ 
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB); 
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    $encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, $encryption_key, utf8_encode($pure_string), MCRYPT_MODE_ECB, $iv); 
    return $encrypted_string; 
} 

这是它的外观在JavaScript警报(同上)

�!e����� 

这是它的外观在PHP加密版本

�!e����� 

这是怪异的一部分时,我明白了,它的外表不同

N~\�7V��咮���a�2�YE� 
解密后

它应该retured值这是它的PHP端

解密值

$to = $_POST["meta"]; 
$to = decrypt($to, ENCRYPTION_KEY); 

这是ENCRYPTION_KEY

if(!defined('ENCRYPTION_KEY')){ 
    define("ENCRYPTION_KEY", "[email protected]#$%^&*"); 
} 

这是decrption

function decrypt($encrypted_string, $encryption_key){ 
$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB); 
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
$decrypted_string = mcrypt_decrypt(MCRYPT_BLOWFISH, $encryption_key, $encrypted_string, MCRYPT_MODE_ECB, $iv); 
return $decrypted_string; 
} 

此功能是jQuery的侧

$("form#form-update-status").on('submit', function(){ 
    var form, url, wipit, status; 
    if($.trim(wipit) == ""){ 
     form = $(this).serializeArray(); 
     url = "ajax/update-status.php"; 
     $.post(url, form, function(data){ 
      $(".button-update-status").html(data); 
     }); 
    } 
    return false; 
}); 
+1

你可以发布你如何输出与加密密钥元? –

+1

@DaveChen我编辑了这个问题。我正在将POST元变成本地**变量$到**'$ to = $ _POST [“meta”];' – user3140617

+0

我的意思是,你如何产生''? –

回答

1

这可能有一些形式的职务期间做字符编码。解决这个问题的最简单方法是使用base64编码的字符串来防止特殊字符。改变你的加密/解密到:

function encrypt($pure_string, $encryption_key){ 
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB); 
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    $encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, $encryption_key, utf8_encode($pure_string), MCRYPT_MODE_ECB, $iv); 
    return base64_encode($encrypted_string); 
} 
function decrypt($encrypted_string, $encryption_key){ 
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB); 
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    $decrypted_string = mcrypt_decrypt(MCRYPT_BLOWFISH, $encryption_key, base64_decode($encrypted_string), MCRYPT_MODE_ECB, $iv); 
    return $decrypted_string; 
} 

而且了解互联网(official documentation)上逃避了一下。你应该真的逃避你所有的输出。所以改变这种说法:

<input type="hidden" name="meta" id="meta" value="<?php echo htmlentities(encrypt($profile_id, ENCRYPTION_KEY), ENT_QUOTES, 'UTF-8'); ?>">