Z dalszych badań odkryłem:
http://dev.mysql.com/doc/refman/5.1/en/news-5-1-11.html
Poprawka bezpieczeństwa:
W przetwarzaniu kodowania wielobajtowego wykryto lukę w zabezpieczeniach typu SQL-injection. Błąd znajdował się na serwerze, niepoprawnie analizując ciąg znaków uciekających za pomocą funkcji API mysql_real_escape_string () C.
Luka ta została odkryta i zgłoszona przez Josha Berkusa i Toma Lane'a w ramach międzyprojektowej współpracy konsorcjum OSDB w zakresie bezpieczeństwa. Więcej informacji na temat wstrzykiwania SQL można znaleźć w poniższym tekście.
Dyskusja. Znaleziono lukę w zabezpieczeniach iniekcji SQL w przetwarzaniu kodowania wielobajtowego. Luka w zabezpieczeniach typu SQL injection może obejmować sytuację, w której użytkownik podał dane do wstawienia do bazy danych, może wprowadzić instrukcje SQL do danych, które wykona serwer. W odniesieniu do tej luki, gdy używane jest uciekanie się z niewiadomym zestawem znaków (na przykład addlashes () w PHP), możliwe jest obejście tego znaku w niektórych zestawach znaków wielobajtowych (na przykład SJIS, BIG5 i GBK). W rezultacie funkcja taka jak addlashes () nie jest w stanie zapobiec atakom typu SQL-injection. Nie można tego naprawić po stronie serwera. Najlepszym rozwiązaniem jest używanie przez aplikacje funkcji ucieczki uwzględniającej zestaw znaków, oferowanej przez funkcję taką jak mysql_real_escape_string ().
Jednak wykryto błąd w sposobie, w jaki serwer MySQL analizuje dane wyjściowe mysql_real_escape_string (). W rezultacie, nawet jeśli użyto funkcji mysql_real_escape_string () obsługującej zestaw znaków, możliwe było wstrzyknięcie SQL. Ten błąd został naprawiony.
Obejścia. Jeśli nie możesz zaktualizować MySQL do wersji, która zawiera poprawkę błędu w analizie mysql_real_escape_string (), ale uruchomisz MySQL 5.0.1 lub nowszą, możesz użyć trybu SQL NO_BACKSLASH_ESCAPES jako obejścia. (Ten tryb został wprowadzony w MySQL 5.0.1.) NO_BACKSLASH_ESCAPES włącza tryb zgodności ze standardem SQL, w którym ukośnik odwrotny nie jest traktowany jako znak specjalny. W rezultacie zapytania będą kończyć się niepowodzeniem.
Aby ustawić ten tryb dla bieżącego połączenia, wprowadź następującą instrukcję SQL:
SET sql_mode='NO_BACKSLASH_ESCAPES';
Możesz także ustawić tryb globalnie dla wszystkich klientów:
SET GLOBAL sql_mode='NO_BACKSLASH_ESCAPES';
Ten tryb SQL można również włączyć automatycznie podczas uruchamiania serwera, używając opcji wiersza poleceń --sql-mode = NO_BACKSLASH_ESCAPES lub ustawiając sql-mode = NO_BACKSLASH_ESCAPES w pliku opcji serwera (na przykład my.cnf lub my.ini w zależności od systemu). (Błąd nr 8378, CVE-2006-2753)
Zobacz także Bug # 8303.