小编ben*_*diy的帖子

PostgreSQL 用美元引用的字符串常量来防止 SQL 注入

我可以使用 PostgreSQL 的带美元引号的字符串常量安全地防止 SQL 注入吗?

我知道处理动态查询的最好方法是使用参数化查询在应用程序层中生成它们,这不是这个问题的内容。所有的业务逻辑都在存储过程中。

我有一个存储过程,它接受参数并生成查询、运行它、格式化结果并将其作为文本块返回。这个函数传递了一个表名、列名和 WHERE 参数。传递给函数的 WHERE 参数来自用户在数据库中输入的数据。我想确保对刺进行消毒,以便构建的查询是安全的。

使用 PostgreSQL 的美元引号字符串常量,我应该能够安全地清理除“ $$ ”之外的所有字符串输入。但是,如果我对 "$" 进行字符串替换以对其进行转义,我应该能够进行安全的字符串比较。

存储过程:

function_name(tablename text, colnames text[], whereparam text)
--Build dynamic query...
Run Code Online (Sandbox Code Playgroud)

函数调用:

SELECT 
  function_name('tablename', ARRAY['col1', 'col2', 'col3'], 'AND replace(col1, ''$'', ''/$'') =  $$' || replace(alt_string_col, '$', '/$') || '$$ ')
FROM alttable
WHERE alt_id = 123;
Run Code Online (Sandbox Code Playgroud)

查询生成:

SELECT col1, col2, col3 FROM tablename WHERE 1=1 AND replace(col1, '$', '/$') =  $$un/safe'user /$/$ data;$$
Run Code Online (Sandbox Code Playgroud)

由于我在将 col1 字段与转义的用户数据进行比较之前对其进行了转义,因此即使用户输入“un/safe'user $$ data;” 在字段 alt_string_col 中,双美元符号不会中断查询并且比较通过。

这是在 PostgreSQL …

postgresql stored-procedures sanitization sql-injection

6
推荐指数
1
解决办法
4288
查看次数

PostgreSQL dblink与命名连接

dblink当我使用命名连接到远程服务器或未命名的连接并断开连接时似乎不起作用.如果我在dblink()中使用带有连接字符串的未命名连接,它可以正常工作.它似乎连接正常,但我尝试使用它时我的连接不可用.关于如何使用命名连接的任何想法?

未提及connstr工作正常:

SELECT testtable.*
FROM   dblink('dbname=testdb port=5432 host=192.168.1.1 user=usr password=pw'
             ,'SELECT * FROM testtable')
AS     testtable(testtable_id integer, testtable_name text);
Run Code Online (Sandbox Code Playgroud)

返回:按预期方式返回两列.

命名不起作用:

连接:

SELECT dblink_connect('myconn'
           ,'dbname=testdb port=5432 host=192.168.1.1 user=usr password=pw');
Run Code Online (Sandbox Code Playgroud)

返回:"OK"

查询:

SELECT testtable.* FROM dblink('myconn', 'SELECT * FROM testtable')
AS     testtable(testtable_id integer, testtable_name text);
Run Code Online (Sandbox Code Playgroud)

返回:

ERROR:  could not establish connection
DETAIL:  missing "=" after "myconn" in connection info string

********** Error **********

ERROR: could not establish connection
SQL state: 08001
Detail: missing "=" after "myconn" in connection info string …
Run Code Online (Sandbox Code Playgroud)

postgresql connection session dblink

5
推荐指数
1
解决办法
1万
查看次数

更快的 CROSS JOIN 替代方案 - PostgreSQL

我正在尝试交叉联接两个表(客户和项目),这样我就可以创建按客户按项目的销售报告。我有 2000 个客户和 2000 个商品。

SELECT customer_name FROM customers; --Takes 100ms

SELECT item_number FROM items; --Takes 50ms

SELECT customer_name, item_number FROM customers CROSS JOIN items; Takes 200000ms

我知道这是 400 万行,但是有可能让它运行得更快吗?我想最终将其与这样的销售表结合起来:

SELECT customer_name, item_number, sales_total FROM customers CROSS JOIN items LEFT JOIN sales ON (customer.customer_name = sales.customer_name, item.item_number=sales.item_number);

销售表显然不会包含所有客户或所有商品,因此这里的目标是有一个报告,显示所有客户和所有商品以及已售出和未售出的商品。

我正在使用 PostgreSQL 8.4

postgresql cross-join

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