К сожалению, активные символы в базах данных sql остаются нерешенными. Каждый поставщик баз данных использует свои собственные (в основном, mysql оракула, который использует \
escape-последовательности)
Официальный способ SQL избежать '
, который является строковым разделителем, используемым для значений, состоит в удвоении '
, как в ''
.
Это должен быть единственный способ обеспечить прозрачность в операторах SQL и единственный способ ввести правильный '
в строку. Как только любой поставщик признает \'
в качестве синонима кавычки, вы открыты для поддержки всех дополнительных escape-последовательностей для разделения строк. Предположим, у вас есть:
'Mac O''Connor' (should go into "Mac O'Connor" string)
и предположим, что единственный способ избежать '
заключается в том, что ... тогда вы должны проверить следующий символ, когда увидите '
для последовательности ''
и:
- вы получите
''
, которое вы измените на '
.
- вы получаете другой, и завершаете строковый литерал и обрабатываете символ как первый из следующего токена.
Но если вы также признаете \
как escape, то вы должны проверить \'
и \\'
, \\\'
(последний должен быть преобразован в \'
на входе) и т. Д. могут возникнуть проблемы, если вы не обнаружите особые случаи как
\''
(должен ли ''
обрабатываться как мандаты SQL, или первый \'
экранирует первый '
, а второй - кавычка конца строки?)
\\''
(если \\
преобразовать в один \
, тогда '
должен быть символом завершения строки, или мы должны переключиться на способ кодирования SQL и рассматривать ''
как один цитата?)
и т.д.
Вы должны проверить документацию базы данных, чтобы узнать, влияют ли \
на управляющие символы только на кодировку специальных символов (например, управляющих символов и т. П.), А также влияет на интерпретацию символа кавычки или просто нет, и вам нужно сбежать '
в другую сторону.
По этой причине поставщики должны включать функции для экранирования / отмены символьных литералов в значения, которые должны быть встроены в оператор SQL. Идея злоумышленников состоит в том, чтобы включить (если вы правильно не делаете) escape-последовательности в данные, которые они публикуют, чтобы посмотреть, позволяет ли это изменить текст команды sql, просто добавив точку с запятой ;
и записав полный SQL-оператор, который позволяет им свободно обращаться к вашей базе данных.