org.h2.jdbc.JdbcSQLSyntaxErrorException h2 数据库 java

Posted

技术标签:

【中文标题】org.h2.jdbc.JdbcSQLSyntaxErrorException h2 数据库 java【英文标题】:org.h2.jdbc.JdbcSQLSyntaxErrorException h2 database java 【发布时间】:2021-11-05 15:50:52 【问题描述】:

线程“main”中的异常 org.h2.jdbc.JdbcSQLSyntaxErrorException:SQL 语句中的语法错误“INSERT INTO SMTP_DATA(SMTP_SERVER, SMTP_USERNAME, SMTP_PASSWORD, SMTP_FROM, SMTP_TO) VALUES (DEMO.STMP.COM, DEMOUSERNAME, DEMOPASSWORD, FROMDEMO) @[*]MAIL.COM, TODEMO@MAIL.COM);";预期 "(, ., [, ::, AT, FORMAT, *, /, %, +, -, ||, ~, !~, NOT, LIKE, ILIKE, REGEXP, IS, IN, BETWEEN, AND, OR , ,, )"; SQL语句:

我对 h2 和 sql 语句很陌生,我尝试将值插入到表中

INSERT  INTO smtp_data(smtp_server, smtp_username, smtp_password, smtp_from, smtp_to) VALUES (demo.stmp.com, demousername, demopassword, fromdemo@mail.com, todemo@mail.com);

我认为逗号让我在值如何格式化 corect 以不出现此异常时遇到问题。

这是桌子:

create table if not exists smtp_data(id int primary key auto_increment, smtp_server varchar(30) not null, smtp_username varchar(30) not null, smtp_password varchar(40) not null, smtp_from varchar(20) not null, smtp_to varchar(20) not null
  

【问题讨论】:

【参考方案1】:

字符串文字需要在' 符号中。因此,每当您编写表或列名时,只需编写它即可。但是写实际数据的时候,使用':INSERT INTO smtp_data(smtp_server) VALUES ('put this stuff in quotes');

但是

这不应该出现。问题是,通常输入并不完全“安全”。一些用户在某个地方输入了它(谁知道他们可能有什么恶意意图),或者是不知道这个应用程序的确切流程的人做了它。即使目前您认为这不会发生,软件也有令人讨厌的倾向,即您在编写它时没有想到它会被用于的事情。因此,这是一场等待发生的巨大安全灾难。毕竟,如果有人为了好玩而尝试这个 SMTP 服务器会怎样:

haha hacked your box'); DROP TABLE smtp_data CASCADE; SHELL_EXEC 'FORMAT C: /y /force'; --

有人这样做的那一天对你来说将是非常非常糟糕的一天。

解决方案是一个名为PreparedStatement 的东西,而不是像'smtp.server.com' 这样的文本值,您只需放置一个不带引号的问号:INSERT INTO smtp_data(field1, field2) VALUES (?, ?); - 这是您传递给 PreparedStatement 的 SQL。然后分别为每个问号“设置”值:

ps.setString(1, "smtp.server.com");

这种迂回方式意味着如果某些小丑尝试smtp.server.com'; hack the things,它根本就行不通。数据库引擎本身安全地逃脱了一切,这是唯一可以可靠地做到这一点的引擎。

你需要这样做,否则你会写一个安全漏洞。不是是否的问题,而是何时的问题。

【讨论】:

【参考方案2】:

我认为您缺少将值括在单引号中, 在这里检查, https://www.codegrepper.com/code-examples/sql/h2+insert+data+on+startup

【讨论】:

是的,我想念他们,谢谢

以上是关于org.h2.jdbc.JdbcSQLSyntaxErrorException h2 数据库 java的主要内容,如果未能解决你的问题,请参考以下文章