Re: ERROR: unsupported Unicode escape sequence - in JSON-type column - Mailing list pgsql-general

From Erik Wienhold
Subject Re: ERROR: unsupported Unicode escape sequence - in JSON-type column
Date
Msg-id 1435849180.1100046.1677511030342@office.mailbox.org
Whole thread Raw
In response to Re: ERROR: unsupported Unicode escape sequence - in JSON-type column  (Laurenz Albe <laurenz.albe@cybertec.at>)
Responses Re: ERROR: unsupported Unicode escape sequence - in JSON-type column  (Tom Lane <tgl@sss.pgh.pa.us>)
Re: ERROR: unsupported Unicode escape sequence - in JSON-type column  (Jan Bilek <jan.bilek@eftlab.com.au>)
List pgsql-general
> On 27/02/2023 13:13 CET Laurenz Albe <laurenz.albe@cybertec.at> wrote:
>
> I'd be curious to know how the customer managed to do that.
> Perhaps there is a loophole in PostgreSQL that needs to be fixed.

Probably via some data access layer and not directly via Postgres.  It's easy
to reproduce with psycopg:

    import psycopg

    with psycopg.connect() as con:
        con.execute('create temp table jsontab (jsoncol json)')
        con.execute(
            'insert into jsontab (jsoncol) values (%s)',
            [psycopg.types.json.Json('\0')],
        )

        with con.execute('select jsoncol from jsontab') as cur:
            print(cur.fetchall())

        try:
            with con.execute('select jsoncol::jsonb from jsontab') as cur:
                pass
            raise AssertionError("jsonb should fail")
        except psycopg.errors.UntranslatableCharacter:
            pass

Another reason to prefer jsonb over json to reject such inputs right away.
The documentation states that json does not validate inputs in constrast to
jsonb.

Of course the OP now has to deal with json.  The data can be sanitized by
replacing all null character escape sequences:

    update jsontab
    set jsoncol = replace(jsoncol::text, '\u0000', '')::json
    where strpos(jsoncol::text, '\u0000') > 0;

But the data access layer (or whatever got the json into the database) must be
fixed as well to reject or sanitize those inputs in the future.

--
Erik



pgsql-general by date:

Previous
From: Ron
Date:
Subject: Re: Repear operations on 50 tables of the same schema?
Next
From: Dávid Suchan
Date:
Subject: pg_upgradecluster transfering only a portion of the data