執行緒“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, DEMOOPASS[FROM]* ]MAIL.COM, [email protected]);"; 預期 "(, ., [, ::, 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);
我認為逗號讓我在如何格式化正確的值中沒有這個例外的問題。
這是表:
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
uj5u.com熱心網友回復:
字串文字需要在'符號中。所以,無論何時你寫一個表名或列名,只要寫下來。但是當您撰寫實際資料時,請使用':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它根本行不通。一切都由資料庫引擎本身安全地轉義,這是唯一可以可靠地做到這一點的引擎。
你需要這樣做,否則你會寫一個安全漏洞。不是如果,而是何時。
uj5u.com熱心網友回復:
我認為您缺少將您的值括在單引號中,請在此處查看, https://www.codegrepper.com/code-examples/sql/h2 insert data on startup
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/351134.html
上一篇:簡化和更正以下查詢
