2013-04-13 60 views
1

试图加密一个社会安全号码和查询工作偶尔,但连用5〜10倍,这将在MySQL的无效查询语法有时

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '�9~���d�~/C�yK�~�� _', ' 50', '62')' at line 1 
SSN: _mosPEdaXEsB7zJCQe5aymaCmkcSl9bnPL5ClLXcz2QA=_ 
IV: _ �6�k���_O�'�9~���d�~/C�yK�~�� _ 

抛出而这里的代码

//Encryption/Decryption key 
    $Key = hash("SHA256", $Lname, true); 
    //Encryption Algorithm 
    $cipher_alg = MCRYPT_RIJNDAEL_256; 

    $iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher_alg, MCRYPT_MODE_ECB), MCRYPT_RAND); 

    $ESSN = mcrypt_encrypt($cipher_alg, $Key, $SSN, MCRYPT_MODE_CBC, $iv); 
    $ESSN = '_' . base64_encode($ESSN) . '_'; 
    $iv = '_' . $iv . '_'; 

if(!mysqli_query($connection, "CALL Update_ClientSSN('$ESSN','$iv', ' $AppID', '" . $_SESSION['ID'] . "');")){ 
     $Save .= " Error saving Client SSN"; 
    echo $connection->error; 
    echo $ESSN . ' IV: ' . $iv; 
    } 

也原本我只是连接IV和密文然后爆炸,但仍然抛出错误,所以下划线只是我试验。我难住了

回答

2

你应该尝试base64_encode $ iv变量,就像你用$ ESSN做的一样,或者至少把它转换为十六进制格式,然后再将它存储在数据库中,看看它是否有帮助。原因是$ iv可能包含一个非法字符,如'(单引号)

+0

它的工作原理谢谢 – user2008572

0

您的问题是,生成的值$iv包含单引号(位于中间某处:O ' 9),这导致无效的插入语句。使用准备好的语句(PDO或Prepared statements)或编码$iv应该解决您的问题

+0

编码IV奏效了,我被编码后这样做时,我被串联在他们面前,谢谢 – user2008572

+0

欢迎您 – agim