2

この塩は私のSELECTコマンドを台無しにします:

p‚ÙÕ†¤éÿ5xãø¤ü¥–ä™m›|§Éá\0yå–e

デコードされた出力:

p‚ÙÕ†¤éÿ5xÃø¤ü¥–ä™m›|§Éá\0yå–e

塩なし:

mysql> SELECT userid, username FROM user;
+--------+--------------+
| userid | username     |
+--------+--------------+
|      1 | user1        |
|      2 | user2        |
|      3 | user3        |
|      4 | user4        |
+--------+--------------+
4 rows in set (0.00 sec)

塩で:

mysql> SELECT userid, username, salt FROM user;
+--------+--------------+----------------------------------+
| userid | username     | salt                             |
+--------+--------------+----------------------------------+
|      1 | user1        | ]ææ=°ù¡£YÒp£'Rm§Éá yåe | |
|      3 | user2        | ¸ÀçqµgsN\ôü¥ä
ɪÓñ1r¦ôyr$ÅK |
|      4 | user4        | \7øþ ÇãÙr|ú&eå¡%»
                                           yYRìÚ¬E |
+--------+--------------+----------------------------------+
4 rows in set (0.00 sec)

ソルトを生成するために使用している関数:

$salt = mcrypt_create_iv(32, MCRYPT_DEV_RANDOM);

次のようにエスケープします。

$salt = mysql_real_escape_string($salt);

問題: 'salt' を選択すると、User2 の行が表示されません。誰でもなぜですか? 関連する問題: User3 にも改行があり、テーブルがめちゃくちゃになっていて、おそらく上記と同じ問題です。

運が悪かったこと: 各単語を「mysql」で終わるようにグーグル検索しました。何も見つかりませんでした..

ありがとう。

4

2 に答える 2

0

実際、MySql データベースにバイナリ データを保存して取得することは問題ありません。必要なターゲット システムに対して適切にエスケープするようにしてください。これの意味は:

バイナリ文字列を MySql データベースに格納するには、INSERT クエリが必要です。クエリに追加する前にバイナリ文字列をエスケープするmysqli_real_escape_string()か、パラメーター化されたクエリを使用します。ところで、mysql_* 関数は非推奨です。mysqli_* 関数または PDO に切り替える必要があります。

データベースから文字列を読み取ると、元のエスケープされていないバイナリ文字列が返されます。この文字列を表示するには、HTML 出力用にエスケープする必要があります。この関数htmlspecialchars()は適切な選択です。

これが実行中の独自のコードであるかどうかに応じて、ある種のコンソールで結果を出すようです。このタイプの出力では正しくエスケープできます。を得た。ツール phpMyAdmin は、テキストを提供することでこの問題を回避しています[BLOB - 32Bytes]

簡単なメモ: パスワードをハッシュするためのソルトが必要な場合は、BCrypt のようなアルゴリズムを使用すると、作業が楽になります。PHP 独自の実装password_hash()は、ハッシュ値自体にパスワード固有のソルトを含めます。その場合、ユーザー固有のソルトなしで行うことができます。

于 2013-07-06T06:23:17.237 に答える