使用单引号

时间:2018-01-17 10:58:34

标签: postgresql

我在存储带有单引号文本的jason值时遇到问题。

以下是该方案,

我的存储过程:

CREATE OR REPLACE FUNCTION JsonParse(inputdata json)
RETURNS void AS $$
DECLARE
BEGIN

    UPDATE 
        MyTable 
    SET 
        settings_details= inputdata
    WHERE 
        settings_key='my-list'; 

END;
$$
LANGUAGE PLPGSQL;


select * from JsonParse('[{
            "myArray": ["New Text1 ''abcd''", "New Text1 ''abcd''"] 
        },
        {"myArray": ["New Text1 ''abcd''", "New Text1 ''abcd''"]}]');

我收到以下错误: 错误:“abcd”或附近的语法错误

我可以为abcd和efgh添加额外的单引号。它解决了这个问题。但问题是我没有对JsonParse过程的输入文本进行控制。 存储过程应该足以处理这个问题。

请知道如何解决这个问题

1 个答案:

答案 0 :(得分:0)

您的存储过程并未拒绝此操作,您正在运行的SQL格式不正确。

尝试一个更简单的例子:

SELECT 'test o'reilly' AS FOO;

正如语法高亮显示的那样,SQL解析器会认为字符串是'test o',而reilly是语法错误。

这表明您没有正确处理SQL查询中的数据输入,并且可能容易受到SQL注入攻击(如果我向您提供" JSON"字符串{}'); DROP TABLE users; -- )。

Everywhere 您将数据添加到SQL查询中,您需要执行以下两项操作之一:

  • 使用您的语言或框架提供的适当功能来转义输入。这将主要只是加倍撇号,但如果正确实施将确保没有其他字符可以根据数据库的字符集等打破输入。
  • 或者,使用参数化准备的查询,在其中使用占位符编写SQL,然后将数据作为单独的参数提供,这是单独传输的,因此不能被误认为是SQL(因此,不需要引用字符串)。在您的情况下,参数化查询可能如下所示:select * from JsonParse(?);,其中execute函数采用一个参数。