相关疑难解决方法(0)

如何避免 PostgreSQL 中的隐式类型转换?

我刚刚发现我可以将任何类型的值插入到 PostgreSQL (9.6) 类型的列中text

drop table if exists d cascade;
create table d ( a text );
insert into d values ( 42 );
insert into d values ( true );
select a, pg_typeof( a ) from d;

  a   | pg_typeof
------+-----------
 42   | text
 true | text
(2 rows)
Run Code Online (Sandbox Code Playgroud)

这是故意的功能吗?我做错了什么吗?有没有设置可以避免这种情况?这是否违反了 RDBMS 应该是类型安全的假设?

我知道这text在 PostgreSQL 中就像一个包罗万象的东西,这通常很方便,因为您可以编写任意类型的字符串表示。但是有时您肯定希望确保只有字符串被插入到给定的列中,以排除隐式转换值。

我能做些什么来避免“随意”类型转换?

postgresql datatypes type-conversion

6
推荐指数
2
解决办法
6161
查看次数

安全引用类型名称以防止 SQL 注入

我将如何引用类型名称以防止 SQL 注入。例如,拿这个

SELECT FORMAT('SELECT CAST(%L AS %s);', '5.42', 'int');
                                                 ^ Quote this
Run Code Online (Sandbox Code Playgroud)

这很好用,但如果'int'相反,''int); DROP DATABASE foo;SELECT ('你会遇到一些问题,

SELECT FORMAT('SELECT CAST(%L AS %s);', '5.42', 'int); DROP DATABASE foo;SELECT (');
                          format                          
----------------------------------------------------------
 SELECT CAST('5.42' AS int); DROP DATABASE foo;SELECT ();
(1 row)
Run Code Online (Sandbox Code Playgroud)

我将如何使用动态 SQL 安全地转换为运行时提供的类型?如果我使用%I而不是%s我得到一个标识符(用 安全引用",但类型名称不是标识符并且不能使用双引号)。

受到try_castJasen提供的“PostgreSQL 替代 SQL Server功能”的回答的启发

postgresql sql-injection datatypes dynamic-sql

2
推荐指数
1
解决办法
514
查看次数