オプションcharacter_set_client
これは、MySQLがクライアントが送信するクエリとデータの文字セットに使用するものです。
デフォルトは、MySQL 5.5、5.6、および5.7ではutf8、8.0ではutf8mb4です。
my.cnfオプションファイルでグローバルに変更することも、セッションごとに名前を設定 ステートメント。
接続時にオプションを明示的に設定すると、デフォルト値を想定する必要がなくなります。
コメントを再確認してください:
SQLインジェクションの2つの異なるケースを混同しているのではないかと思います。これらの特定の5文字セットを使用する場合はリスクがありますが、2次SQLインジェクションとは関係ありません。
文字セットのリスクは、いくつかのマルチバイト文字セットが原因です。リテラル引用文字をエスケープするために円記号を挿入するのが一般的です。ただし、一部の文字セットでは、バックスラッシュバイトが前のバイトにマージされ、マルチバイト文字を形成します。そのため、引用はエスケープされません。
2次SQLインジェクションはまったく異なります。これは、任意の文字セットで発生する可能性があります。これは、攻撃者がフォームへの入力などの正当な手段でデータベースにデータを追加する場合です。データの挿入はエラーなしで処理されます。ただし、挿入される値には、後のSQLクエリを利用するように設計された構文が含まれています。
これは、データベースにすでに安全に保存されているデータが、適切なパラメーター化なしで使用するのに何らかの形で「安全」であると開発者が信じていることに依存しています。
悪意のあるものではなく単なる偶発的な2次SQLインジェクションの例としては、人の名前が「O'Reilly」であり、その名前がコードによって読み取られ、後続のクエリで使用される場合があります。
$name = $db->query("SELECT last_name FROM people WHERE id = 123")->fetchColumn();
$sql = "SELECT * FROM accounts WHERE account_owner_last_name = '$name'";
名前に文字通りのアポストロフィが含まれていると、その例の2番目のクエリが台無しになります。