在PHP中,我有一个action.php
页面,我有一个存储在变量中的字符串
$myString = "Foo Bar";
我正在使用AES256使用以下函数加密此字符串:
function aes256Encrypt($key, $data) {
if(32 !== strlen($key)) $key = hash('SHA256', $key, true);
$padding = 16 - (strlen($data) % 16);
$data .= str_repeat(chr($padding), $padding);
return mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, str_repeat("\0", 16));
}
在将数据插入MySQL数据库之前,我将mysql_real_escape_string()
用于加密字符串,然后再将其插入数据库
据我所知,mysql_real_escape_string()
函数会在需要转义的字符之前添加\
!
另一方面,我需要从MySQL获取数据并使用此函数对其进行解密:
function aes256Decrypt($key, $data) {
if(32 !== strlen($key)) $key = hash('SHA256', $key, true);
$data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, str_repeat("\0", 16));
$padding = ord($data[strlen($data) - 1]);
return substr($data, 0, -$padding);
}
一切都很好,当我解密我从db获得的字符串时,我得到了正确的字符串,但是我真的很困惑,如果没有从DB中获取字符串后从字符串中取消转义,这怎么能正常工作呢? / p>
答案 0 :(得分:5)
首先,您应该真正从使用mysql_*
切换到PDO或mysqli并使用正确的参数化语句。然后,您完全避免拨打mysql_real_escape_string
。
逃避概念在编程方面非常广泛,它适用于此。假设您要将某人的姓名存储到数据库:Coryn O'Driscoll
。这甚至不是恶意的,但此查询将失败:
INSERT INTO Names VALUES ('Coryn O'Driscoll')
你有一个未闭合的字符串。
mysql_real_escape_string
将此转换为('Coryn O\'Driscoll'
)。 \'
向mysql发出信号,指出撇号不是查询语法的一部分,而是实现要插入的标量值的一部分。它实际上是Coryn O'Driscoll
插入的。这就是为什么再次选择它时不必从中删除任何反斜杠的原因。