-1

在 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 获得字符串后不取消转义字符串,这怎么能正常工作?

4

1 回答 1

5

首先,您应该真正从 using 切换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. 这就是为什么当您再次选择它时不必从中删除任何反斜杠的原因。

于 2013-01-27T15:51:13.220 回答