Моя Ubuntu показывает ошибку: & ldquo; Ошибка сегментации (ядро сброшено) & rdquo; при установке django в виртуальной среде

Вы должны защищаться от SQL injection всякий раз, когда вы вводите ввод пользователя в код. Это включает имена таблиц и столбцов, поступающие из системных каталогов или из прямого ввода пользователя. Таким образом, вы также предотвращаете тривиальные исключения с нестандартными идентификаторами. Существуют в основном три встроенных метода :

1. format()

1-й запрос, дезинфицированный:

CREATE OR REPLACE FUNCTION foo(_t text)
  RETURNS void AS
$func$
BEGIN
   EXECUTE format('
   ALTER TABLE %I ADD COLUMN c1 varchar(20)
                , ADD COLUMN c2 varchar(20)', _t);
END
$func$  LANGUAGE plpgsql;

format() требует Postgres 9.1 или новее. Используйте его с спецификатором формата %I.

Имя таблицы может быть неоднозначным. Возможно, вам придется указать имя схемы, чтобы избежать неправильной замены неправильной таблицы. Связано:

Помимо этого: добавление нескольких столбцов с одной командой ALTER TABLE дешевле.

2. regclass

Вы также можете использовать приведение к зарегистрированному классу (regclass) для особого случая имен таблиц существующих . Необязательно с учетом схемы. Это немедленно и изящно не работает для имен таблиц, которые не являются действительными и видимыми вызывающему пользователю. 1-й запрос, обработанный литой до regclass:

CREATE OR REPLACE FUNCTION foo(_t regclass)
  RETURNS void AS
$func$
BEGIN
   EXECUTE 'ALTER TABLE '|| _t ||' ADD COLUMN c1 varchar(20)
                                 , ADD COLUMN c2 varchar(20)';
END
$func$  LANGUAGE plpgsql;

Вызов:

SELECT foo('table_name');

Или:

SELECT foo('my_schema.table_name'::regclass);

Кроме того: рассмотрите возможность использования только text вместо varchar(20) .

3. quote_ident()

Второй запрос, дезинфицированный:

CREATE OR REPLACE FUNCTION foo(_t regclass, _c text)
  RETURNS void AS
$func$
BEGIN
   EXECUTE 'UPDATE '|| _t ||'   -- sanitized with regclass
            SET '|| quote_ident(_c) ||' = ''This is a test''';
END
$func$  LANGUAGE plpgsql;

Для множественных конкатенаций / интерполяций format() является более чистым ...

Похожие ответы:


Чувствительный к регистру!

Имейте в виду, что некотируемые идентификаторы не приведены в нижнем регистре здесь. При использовании в качестве идентификатора в SQL Postgres автоматически переходит к нижнему регистру . Но здесь мы передаем строки для динамического SQL. Когда экраны экранируются, как показано, идентификаторы CaMel-case (например, UserS) будут сохранены путем двойного запуска ("UserS"), как и другие нестандартные имена, такие как "name with space" "SELECT" и т. Д. Следовательно, имена в этом контексте чувствительны к регистру.

Мой постоянный совет заключается в том, чтобы использовать только юридические идентификаторы нижнего регистра и никогда не беспокоиться об этом.

Кроме того: одинарные кавычки для значений, двойные кавычки для идентификаторов .

0
задан tk421 22 February 2019 в 19:10
поделиться