При первом проходе через mysqli_real_escape_string
следующие символы экранируются путем вставки \
перед каждым из опасных символов:
NUL (ASCII 0), \ n, \ r, \, ', "и Control-Z:
NUL (chr(0)) becomes "\0" (chr(92).chr(48))
\n (chr(13)) becomes "\n" (chr(92).chr(110))
\r (chr(10)) becomes "\r" (chr(92).chr(114))
\ (chr(92)) becomes "\\" (chr(92).chr(92))
' (chr(39)) becomes "\'" (chr(92).chr(39))
" (chr(34)) becomes "\"" (chr(92).chr(34))
Control-Z (chr(26)) becomes "\Z" (chr(92).chr(90))
При втором проходе через mysqli_real_escape_string
, \
снова экранируется:
"\0" (chr(92).chr(48)) becomes "\\0" (chr(92).chr(92).chr(48))
"\n" (chr(92).chr(110)) becomes "\\n" (chr(92).chr(92).chr(110))
"\r" (chr(92).chr(114)) becomes "\\r" (chr(92).chr(92).chr(114))
"\\" (chr(92).chr(92)) becomes "\\\\" (chr(92).chr(92).chr(92).chr(92))
"\'" (chr(92).chr(39)) becomes "\\'" (chr(92).chr(92).chr(39))
"\"" (chr(92).chr(34)) becomes "\\"" (chr(92).chr(92).chr(34))
"\Z" (chr(92).chr(90)) becomes "\\Z" (chr(92).chr(92).chr(90))
Двойное экранирование строк не создает какой-либо уязвимости, но оно добавляет много дополнительных символов «\» в строки, которые вы сохраняете в базе данных.
Лучший способ сделать экранирование - это: 1Отключите магические кавычки 2) Используйте запросы только с именованными параметрами и ничего не экранируйте перед передачей их в запрос. MySQL (и все остальные поставщики баз данных в этом отношении) будет правильно экранировать строки (однако вы можете столкнуться спроблема с chr (0), завершающим строку).
Если вам абсолютно необходимо использовать строковые запросы, экранируйте данные один раз и только один раз, непосредственно перед тем, как они будут вставлены в запрос. Не экранируйте всезапрос.