-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()前に、DBに挿入する前に暗号化された文字列を使用しています

私の知る限り、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

まず、実際に使用mysql_*からPDOまたはmysqliに切り替えて、適切にパラメーター化されたステートメントを使用する必要があります。次に、呼び出しをmysql_real_escape_string完全に回避します。

エスケープの概念はプログラミングにおいて非常に広く、ここに適用されます。誰かの名前をDBに保存したいとします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 に答える