Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PHP Was ist der Standardzeichensatz für pdo mysql

Die Option character_set_client verwendet MySQL für den Zeichensatz von Abfragen und Daten, die der Client sendet.

Der Standardwert ist utf8 in MySQL 5.5, 5.6 und 5.7 und utf8mb4 in 8.0.

Es kann auch global in Ihrer my.cnf-Optionsdatei oder pro Sitzung durch einen NAMEN EINSTELLEN Aussage.

Es ist gut, die Option explizit festzulegen, wenn Sie eine Verbindung herstellen, damit Sie nicht den Standardwert annehmen müssen.

Zu Ihrem Kommentar:

Ich fürchte, Sie verwechseln zwei verschiedene Fälle von SQL-Injection. Bei der Verwendung dieser spezifischen fünf Zeichensätze besteht ein Risiko, das jedoch nicht mit der SQL-Einschleusung zweiter Ordnung zusammenhängt.

Das Zeichensatzrisiko ist auf einige Multibyte-Zeichensätze zurückzuführen. Es ist üblich, einen umgekehrten Schrägstrich einzufügen, um ein wörtliches Anführungszeichen zu maskieren. Aber in einigen Zeichensätzen wird das Backslash-Byte mit dem vorangehenden Byte zusammengeführt und bildet ein Multi-Byte-Zeichen. Dadurch bleibt das Zitat ohne Escapezeichen.

Die SQL-Injection zweiter Ordnung ist völlig anders. Es kann bei jedem Zeichensatz auftreten. Dies ist der Fall, wenn ein Angreifer auf legitime Weise Daten zu Ihrer Datenbank hinzufügt, z. B. durch Ausfüllen eines Formulars. Das Einfügen der Daten wird fehlerfrei abgewickelt. Die von ihnen eingefügten Werte enthalten jedoch eine Syntax, die darauf ausgelegt ist, einige spätere SQL-Abfragen auszunutzen.

Es verlässt sich darauf, dass Entwickler glauben, dass Daten, die bereits sicher in ihrer Datenbank gespeichert wurden, ohne die richtige Parametrisierung irgendwie „sicher“ für die Verwendung sind.

Ein Beispiel für eine SQL-Einschleusung zweiter Ordnung, die nur zufällig statt böswillig ist, könnte sein, dass eine Person den Nachnamen "O'Reilly" hat und der Name vom Code gelesen und in einer nachfolgenden Abfrage verwendet wird.

$name = $db->query("SELECT last_name FROM people WHERE id = 123")->fetchColumn();
$sql = "SELECT * FROM accounts WHERE account_owner_last_name = '$name'";

Wenn der Name ein wörtliches Apostroph enthält, würde dies die zweite Abfrage in diesem Beispiel durcheinanderbringen.