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

org.h2.jdbc.JdbcSQLSyntaxErrorException h2 database java

Exception in thread "main" org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "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);"; expected "(, ., [, ::, AT, FORMAT, *, /, %, +, -, ||, ~, !~, NOT, LIKE, ILIKE, REGEXP, IS, IN, BETWEEN, AND, OR, ,, )"; SQL statement:

我是 h2 和 sql 语句的新手 我尝试将值插入到 table

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 以没有此异常的值中遇到问题。

这是table:

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
  

字符串文字需要在 ' 个符号中。所以,每当你写一个 table 或列名时,就写它。但是当你写入实际数据时,使用'INSERT INTO smtp_data(smtp_server) VALUES ('put this stuff in quotes');

然而

这永远不应该出现。问题是,通常输入不完全是 'safe'。一些用户在某个地方输入了它(谁知道他们可能有什么恶意),或者不知道这个应用程序的确切流程的人做了这个。即使目前您认为这不可能发生,软件也有一种令人讨厌的倾向,即用于您在编写它时没有想到它会用于的事情。因此,这是一场等待发生的巨大安全灾难。毕竟,如果有人为了好玩而尝试这个 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 (?, ?); - 那就是 SQL传递给 PreparedStatement。然后分别 'set' 每个问号的值:

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

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

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

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