Проблема безопасности / SQL инъекций с сопоставлением MySQL? - PullRequest
2 голосов
/ 08 сентября 2010

Возможно, у меня пока недостаточно понимания, поэтому я ищу небольшое направление.

Все наши таблицы показывают параметры сортировки latin1_swedish_ci. Вот что я вижу в переменных mysql:

collation connection utf8_general_ci
(Global value) latin1_swedish_ci
collation database latin1_swedish_ci
collation server latin1_swedish_ci

Теперь мы видим, что utf8 (или, по крайней мере, контент на иностранном языке) довольно часто хранится в db, и он правильно отображает. Разве для этого не имеет значения сопоставление?

Использование чего-то вроде php addlashes () при вводе пользователем - достаточно ли этого? Или это оставляет возможность для инъекций?

EDIT: Итак, глядя на полный набор параметров сортировки / кодировки, по крайней мере, в phpmyadmin, я вижу:

character set client    utf8
(Global value)  latin1
character set connection    utf8
(Global value)  latin1
character set database  latin1
character set filesystem    binary
character set results   utf8
(Global value)  latin1
character set server    latin1
character set system    utf8
character sets dir  /usr/share/mysql/charsets/
collation connection    utf8_general_ci
(Global value)  latin1_swedish_ci
collation database  latin1_swedish_ci
collation server    latin1_swedish_ci

Ответы [ 2 ]

2 голосов
/ 08 сентября 2010

Сортировка описывает только правила сравнения символов определенного набора символов. Одним из правил может быть то, что a равно A, b равно B и т. Д. Или что ß равно ss, ä равно ae и т. Д.

А для явного экранирования строк для MySQL используйте mysql_real_escape_string. Эта функция в противоположность addslashes и mysql_escape_string учитывает фактическую кодировку символов соединения.

Но вам нужно установить кодировку символов соединения с помощью mysql_set_charset. В противном случае изменение не будет распознано (см. Описание функций API C - mysql_real_escape_string()):

Если вам нужно изменить набор символов соединения, вам следует использовать функцию mysql_set_character_set() вместо выполнения оператора SET NAMES (или SET CHARACTER SET). mysql_set_character_set() работает как SET NAMES, но также влияет на набор символов, используемый mysql_real_escape_string(), а SET NAMES - нет.

0 голосов
/ 08 сентября 2010

Все наши таблицы показывают параметры сортировки latin1_swedish_ci
контент на иностранном языке отображается правильно

Что-то не так с вашей базой данных.
Он не сможет хранить нелатинские символы или не сможет упорядочить / отфильтровать содержимое базы данных должным образом.

Для хранения иностранных символов для таблиц должна быть установлена ​​кодировка utf8. А также кодировка соединения.

Использование чего-то вроде php addlashes () при вводе пользователем - достаточно ли этого?

Аддешлаши достаточно, если ваши кодировки только latin1 и utf8. Но остальное не так.

  1. addlashes () или другие экранирующие функции не помогают в одиночку! Работает только с кавычками вокруг экранированных данных. Таким образом, это должно быть не просто «Использование чего-то вроде addlashes ()», но «Использование чего-то вроде addlashes () для строк в кавычках и приведение типов к числам»
  2. Не для ввода пользователем! Побег не для дезинфекции! Это только для правильного форматирования запроса. Любой запрос. С любыми данными. Не только пользовательский ввод, как думают все в этом бедном мире, но и для любых данных (которые поступают в запрос в виде строк в кавычках).
...