Я частично не согласен с другими постерами. Если вы запустите все свои параметры через функцию, которая удваивает кавычки, это должно предотвратить любую возможную атаку инъекцией. На самом деле на практике более частой проблемой является не преднамеренное саботаж, а запросы, которые прерываются, потому что значение законно включает в себя одинарную кавычку, например, клиент с именем «O'Hara» или поле комментария «Не звоните Салли до 9:00». В любом случае, я все время убегаю, и у меня никогда не было проблем.
Одно предостережение: на некоторых движках базы данных могут быть и другие опасные символы, кроме одной кавычки. Единственный пример, который я знаю, это Postgres, где обратный слеш - это магия. В этом случае ваша функция escape также должна удваивать обратную косую черту. Проверьте документацию.
Я не имею ничего против использования подготовленных операторов, и для простых случаев, когда единственное, что меняется, - это значение параметра, они являются отличным решением. Но я обычно нахожу, что мне приходится строить запросы по частям, основываясь на условиях в программе, например, если параметр X не равен нулю, мне нужно не только добавить его в предложение where, но мне также нужно дополнительное соединение, чтобы добраться до значение мне действительно нужно проверить. Подготовленные заявления не могут справиться с этим. Конечно, вы могли бы построить SQL по частям, превратить его в подготовленный оператор и затем предоставить параметры. Но это просто боль без какой-либо явной выгоды.
В настоящее время я в основном пишу на Java, что позволяет перегружать функции, то есть иметь несколько реализаций в зависимости от типа передаваемого параметра. Поэтому я обычно пишу набор функций, которые я обычно называю просто «q» для «quote», которые возвращают данный тип, соответствующим образом заключенный в кавычки. Для строк это удваивает любые кавычки, затем шлепает кавычки вокруг всего этого. Для целых чисел он просто возвращает строковое представление целого числа. Для дат он преобразуется в стандартный формат даты JDBC (Java SQL), который драйвер затем должен преобразовать во все, что необходимо для конкретной используемой базы данных. И т. Д. (В моем текущем проекте я даже включил массив как переданный тип, который я конвертирую в формат, подходящий для использования в предложении IN.) Затем каждый раз, когда я хочу включить поле в оператор SQL, я просто пишу " д (х)». Поскольку это наложение кавычек, когда это необходимо, мне не нужны дополнительные манипуляции со строками для наложения кавычек, так что это, вероятно, так же просто, как не делать escape.
Например, уязвимым способом:
String myquery = "выбрать имя клиента, где customercode = '" + custcode + "'";
Безопасный путь:
String myquery = "выберите имя от клиента, где customercode =" + q (custcode);
Правильный путь - это не просто печатный текст, а неправильный, так что легко привыкнуть к привычке.