【问题标题】:Does the use of a colon (":") in PostgreSQL queries cause the statement to fail?在 PostgreSQL 查询中使用冒号 (":") 会导致语句失败吗?
【发布时间】:2018-07-21 04:20:34
【问题描述】:

我正在尝试使用 INSERT 语句将数据从 Spring 应用程序前端的表单添加到 PostgreSQL 表。该表单主要包括文本值,但我还包括HH:MM 格式的时间输入要求。在旁注中,我还要求以DD/MM/YYYY 的形式提供日期,并且表格中的文本可以包括逗号、句点和撇号。根据输入表单的数据(例如姓名、传记、地址等),我收到以下错误,指向数据的不同位置。

org.postgresql.util.PSQLException: ERROR: syntax error at or near "blank"
Position: x

因此,我无法确定问题的确切根源,但我对此类错误的任何经验都存在某种描述符号的问题。

我使用executeUpdate 在 java 类中创建插入语句,如下所示:

int rs = stmt.executeUpdate( "INSERT INTO events VALUES 
(nextval('reviews_id_seq'::regclass), '" + eventname +" '," +description+"," 
+address+", '"+starttime+"', '"+endtime+"', 
'"+username+"','"+attendees+"');");

有什么想法吗?

【问题讨论】:

  • (1) 使用占位符不是更好更安全吗? SQL注入是真实存在的。 (2) 你最好指定你的列:insert into events (eventname, description, ...) values (...)。 (3) 如果您指定了列名,那么您不必担心手动将id 设置为下一个序列值,列的default 应该会处理这个问题。

标签: java postgresql spring-boot


【解决方案1】:

您的声明没有将description 括在单引号中。您尝试插入的实际数据中可能有一个冒号。正如 cmets 中所述,这是一种非常危险的查询方式。考虑使用参数化查询,而不是使用字符串构建查询。

明确列出要插入的表的列也是一种很好的做法。根据您的数据库驱动器,您的查询可能如下所示:

insert into events (name, description, address) values (?, ?, ?);

然后您按顺序将这些值提供给数据库驱动程序。 (见下文)。

Sql query with bind variables execution in Jdbc

What is SQL injection?

https://www.owasp.org/index.php/Query_Parameterization_Cheat_Sheet

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多