Является ли это для выбора конкретного строкового значения или для вставки его в базу данных, строка должна быть допустимой для SQL, в частности:
- Начало строки обозначается одинарной кавычкой
- Любая одинарная кавычка, являющаяся частью строки, должна быть удвоена (чтобы SQL не понимал ее как конец строки)
- Конец строки помечен одинарной кавычкой.
1011 * Поэтому *
'O''Neil'
- это правильный способ «кодировать» имя О'Нила, потому что, если мы использовали
'O'Neil'
вместо этого SQL будет видеть это как строку, начинающуюся с буквы O, но заканчивающуюся там после. За этой однобуквенной строкой следует выражение Neil'
, которое SQL не может понять.
Приведенная выше информация позволит вам хранить имена и запрашивать их таким образом, чтобы сохранить одинарные кавычки, встроенные в имена, как в случае с ирландским O'xxxx.
Помимо помощи в исправлении этой ситуации, было бы упущением, если бы я забыл упомянуть о рисках SQL-инъекций .
Теперь, когда вы понимаете, что не удвоенная одинарная кавычка завершит строку, вы можете увидеть, как злоумышленники могут использовать это для «обмана» приложения.
Например, предположим, что пользователь как-то догадался, что используемая таблица - search
, он может продолжить и заполнить следующую строку в окне редактирования приложения
.
O'; DELETE FROM search where 'a%'='a
Ваша логика будет использовать эту строку следующим образом
Lstart="O'; DELETE FROM search where 'a%'='a"; select * from search where lname like '%Lstart%'
-- which effectively will be substituted as
select * from search where lname like '%O'; DELETE FROM search where 'a%'='a%'
Что, если учетная запись, связанная с базовым соединением SQL, авторизована таким образом, приведет к удалению всех строк из таблицы и повреждению вашего приложения!
Систематически удваивая одинарные кавычки и используя несколько других мер предосторожности, таких как использование параметризованных запросов, можно защитить приложение (и его базу данных) от атак этого типа.