在使用mysql_real_escape_string后,我是否需要取消加密字符串?

时间:2013-01-27 15:46:30

标签: php .net mysql mysql-real-escape-string

在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>

1 个答案:

答案 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插入的。这就是为什么再次选择它时不必从中删除任何反斜杠的原因。