SQL-инъекция и Postgres "CREATE SCHEMA" - PullRequest
2 голосов
/ 11 мая 2011

Как использовать CREATE SCHEMA schema_name в postgres, как предотвратить SQL-инъекцию параметра schema_name, если он должен быть введен пользователем?

schema_name не может быть значением в кавычках,так например ActiveRecord::Base.sanitize() не будет работать.(если вы используете рельсы).

Ответы [ 3 ]

2 голосов
/ 11 мая 2011

Довольно необычно (даже страшно) разрешать пользователям создавать схемы (в общем, делать DDL). Вы уверены, что хотите это сделать?

В любом случае вы можете делать обычные вещи: либо санировать ваш ввод (и я предполагаю, что, если вы разрешите пользователю создавать schames по крайней мере, вы можете ограничить разрешенные имена - например, только буквенно-цифровыми и т. Д.), И / или используйте подготовленный оператор, связывающий имя схемы (это зависит от вашего языка / среды).

1 голос
/ 11 мая 2011

Пользователи никогда не должны иметь разрешения DDL, им это не нужно, и это дает им слишком много энергии.

Вы можете использовать функцию SQL с помощью quote_ident, чтобы создать схему и избежать внедрения SQL:

    CREATE OR REPLACE FUNCTION new_schema(IN _schemaname TEXT) 
    RETURNS bool 
    LANGUAGE plpgsql 
    AS
    $$
    BEGIN;
      EXECUTE 'CREATE SCHEMA ' || quote_ident(_schemaname);

      RETURN true;
    END;
    $$
    SECURITY DEFINER;

-- test:
SELECT new_schema('Frank; drop database template1');
1 голос
/ 11 мая 2011

Я знаю, что это, вероятно, не тот ответ, который вы ищете, но если в вашем дизайне есть пользователи, решающие имена ваших схем, но вы не доверяете своим пользователям, вам действительно нужно сделать редизайн.То, что ваши пользователи выбирают имя схемы, сродни тому, чтобы просить пользователей выбирать имена классов и функций.

Если вы действительно, действительно хотите это сделать, я бы использовал регулярное выражение, чтобы ограничить что-то вроде 16 алфавитно-цифровымтолько символы, начиная с буквенного символа, после принудительной строчной буквы (/ ^ [az] [a-z0-9] {1,15} $ /).Вам также нужно будет явно отфильтровать «public» как имя схемы, information_schema (если вы также разрешите подчеркивание) и другие имена встроенных схем.

Опять же, я готов поспорить, чтоВы действительно не хотите этого делать, и есть лучший способ решить основную проблему.

...