在postgres中使用CREATE SCHEMA schema_name
时,如果需要用户输入,如何防止SQL注入schema_name
参数?
schema_name
不能是引用值,因此例如ActiveRecord::Base.sanitize()
将不起作用。 (如果你使用铁轨)。
答案 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');