Indstillingen character_set_client
er, hvad MySQL bruger til det tegnsæt af forespørgsler og data, som klienten sender.
Standarden er utf8 i MySQL 5.5, 5.6 og 5.7, og utf8mb4 i 8.0.
Det kan også ændres globalt i din my.cnf-indstillingsfil eller pr. session af en INDSTILLE NAVNE erklæring.
Det er godt at indstille indstillingen eksplicit, når du opretter forbindelse, så du ikke behøver at antage dens standardværdi.
Om din kommentar:
Jeg er bange for, at du blander to forskellige tilfælde af SQL-injektion sammen. Der er en risiko ved brug af disse specifikke fem tegnsæt, men det er ikke relateret til andenordens SQL-injektion.
Tegnsætrisikoen skyldes nogle multi-byte tegnsæt. Det er almindeligt at indsætte en skråstreg for at undslippe et bogstaveligt citat. Men i nogle tegnsæt bliver backslash-byten flettet ind i den foregående byte og danner et multi-byte-tegn. Det efterlader citatet uundgået.
Andenordens SQL-injektion er helt anderledes. Det kan forekomme med ethvert tegnsæt. Dette er, når en angriber tilføjer data til din database på legitime måder, som at udfylde en formular. Indsættelse af data håndteres uden fejl. Men de værdier, de indsætter, indeholder syntaks designet til at udnytte en senere SQL-forespørgsel.
Det er afhængigt af, at udviklere tror, at data, der allerede er blevet gemt sikkert i deres database, på en eller anden måde er "sikre" til brug uden korrekt parameterisering.
Et eksempel på andenordens SQL-injektion, der blot er utilsigtet i stedet for ondsindet, kunne være, at en person har efternavnet "O'Reilly", og navnet læses af koden og bruges i en efterfølgende forespørgsel.
$name = $db->query("SELECT last_name FROM people WHERE id = 123")->fetchColumn();
$sql = "SELECT * FROM accounts WHERE account_owner_last_name = '$name'";
Hvis navnet indeholder en bogstavelig apostrof, ville det ødelægge den anden forespørgsel i det eksempel.