2013-06-02 38 views
0

我正在努力解決這個問題,並且出於某種原因,我無法解決它。SQL準備好的語句不起作用

Connection conn = null; 

PreparedStatement ps = null;           
String query = "INSERT INTO " + "tags" + "(Name, Income, Expense) VALUES(?,?,?)"; 
ps = conn.prepareStatement(query); 
ps.setString(1, tag); 
ps.setString(2, amount_); 
ps.setString(3, "0"); 
ps.executeQuery(); 

Tag是用戶輸入的字符串,用戶還可以發送SQL注入!爲什麼?? 另外我得到這個Eclipse錯誤:Null pointer access: The variable conn can only be null at this location

+0

什麼是'conn'?這裏是'null'。 –

+0

'connection con = drivermanager.getconnection;' – mjosh

回答

0

您的數據庫連接尚未初始化。在創建預準備語句之前,您需要使用DriverManager類來獲取數據庫連接。

如果用戶提供了「標籤」,那麼您的SQL仍然可能容易受到注入攻擊,因爲用戶可以指定其他SQL操作而不是表名。例如,如果用戶輸入:

"users (Name, Income, Expense) VALUES('','',''); drop table accounts; INSERT INTO users ;" 

爲「標籤」的值,用戶可以插入一個額外的行到用戶表和刪除帳戶表。您需要將「標記」作爲準備好的語句的一部分,將「標記」替換爲「?」。並使用setString來分配值。

+0

感謝您的回答。 PS。你知道一些好的SQLite準備好的教程嗎? – mgulan