SQL注入和Postgres“CREATE SCHEMA”

时间:2011-05-11 02:38:22

标签: postgresql schema sql-injection

在postgres中使用CREATE SCHEMA schema_name时,如果需要用户输入,如何防止SQL注入schema_name参数?

schema_name不能是引用值,因此例如ActiveRecord::Base.sanitize()将不起作用。 (如果你使用铁轨)。

3 个答案:

答案 0 :(得分:2)

允许用户创建模式(通常用于DDL)是相当不寻常的(甚至是可怕的)。你确定要这么做吗?

在任何情况下,你可以做通常的事情:要么消毒你输入(我想如果你允许用户至少创建schames你可以限制允许的名称 - 例如只有字母数字等),和/或使用预准备语句,绑定模式名称(这取决于您的语言/环境)。

答案 1 :(得分:1)

我知道这可能不是您正在寻找的答案,但如果您的设计让用户决定您的架构名称,但您不信任您的用户,那么您确实需要重新设计。让用户决定模式名称类似于要求用户决定类和函数名称。

如果你真的,真的想这样做,我会使用正则表达式来限制只有16个字母数字字符,从字母字符开始,强制小写后(/ ^ [az] [a-z0- 9] {1,15} $ /)。您还需要显式过滤掉“public”作为模式名称,information_schema(如果您也允许使用下划线)以及其他内置模式名称。

同样,我愿意打赌你真的不想这样做,并且有更好的方法来解决你的根本问题。

答案 2 :(得分:1)

用户永远不应该拥有DDL权限,他们不需要它,并且它给了他们太多的权力。

您可以使用quote_ident的SQL函数来创建模式并避免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');