Java >> Java tutorial >  >> Tag >> SQL

org.h2.jdbc.JdbcSQLSyntaxErrorException h2 database java

Undtagelse i tråden "main" org.h2.jdbc.JdbcSQLSyntaxErrorException:Syntaksfejl i SQL-sætningen "INSERT INTO SMTP_DATA(SMTP_SERVER, SMTP_USERNAME, SMTP_PASSWORD, SMTP_FROM, SMTP_TO) VALUES (DEMO.STMOWORD.COM, DEMO.STMOWORD.COM) ]MAIL.COM, [email protected]);”; forventet "(, ., [, ::, AT, FORMAT, *, /, %, +, -, ||, ~, !~, NOT, LIKE, ILIKE, REGEXP, IS, IN, MELLEM OG, ELLER , ,, )"; SQL-sætning:

Jeg er lidt ny med h2 og sql statments Jeg forsøger at indsætte værdier i tabellen

INSERT  INTO smtp_data(smtp_server, smtp_username, smtp_password, smtp_from, smtp_to) VALUES (demo.stmp.com, demousername, demopassword, [email protected], [email protected]);

Jeg tror, ​​at kommaerne gør mig til et problem i værdierne, hvordan man formaterer korrekt for ikke at have denne undtagelse.

Dette er tabellen:

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
  

Svar

Strengliteraler skal være i ' symboler. Så hver gang du skriver et tabel- eller kolonnenavn, skal du bare skrive det. Men når du skriver faktiske data, skal du bruge ' :INSERT INTO smtp_data(smtp_server) VALUES ('put this stuff in quotes');

DOG

Dette må ALDRIG komme op. Problemet er, at input normalt ikke er "sikkert". Nogle brugere indtastede det et sted (og hvem ved, hvilken ondsindet hensigt de måtte have), eller nogen, der ikke kender det nøjagtige procesflow for denne app, gjorde det. Selvom du i øjeblikket ikke tror, ​​det kan ske, har software den grimme tendens til at blive brugt til ting, som du ikke havde forestillet dig, den ville blive brugt til, når du skriver den. Derfor er dette en enorm sikkerhedskatastrofe, der venter på at ske. Når alt kommer til alt, hvad nu hvis nogen for sjov prøver denne SMTP-server:

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

Den dag, nogen gør det, bliver en meget, meget dårlig dag for dig.

Løsningen er noget der hedder PreparedStatement , hvor i stedet for tekstværdier som 'smtp.server.com' , du har bare sat et spørgsmålstegn uden anførselstegn:INSERT INTO smtp_data(field1, field2) VALUES (?, ?); – det er den SQL, du sender til PreparedStatement. Derefter 'sætter' du hver for sig værdien for hvert spørgsmålstegn:

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

Denne rundkørsel betyder, at hvis en klovn prøver smtp.server.com'; hack the things det vil simpelthen ikke virke. Alt er sikkert undslippet af selve DB-motoren, som er den eneste, der pålideligt kan gøre dette.

Du skal gøre det på denne måde, ellers vil du skrive et sikkerhedslæk. Ikke et spørgsmål om hvis, men hvornår.


Java tag