[英]Prepared Statement with SQL Query issue
下面顯示的代碼用於搜索職位列表,添加了准備好的語句以防止 SQL 注入,它也很容易受到攻擊。 查詢語句搜索在添加准備好的語句之前起作用,但是現在什么也不返回。 誰能看到我做錯了什么? 謝謝。 之前的代碼如下所示:
try (Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/SQL_DB", "root", "root"); Statement stmt = con.createStatement()) { rs = stmt.executeQuery(queryStatement);
代碼現在看起來像這樣:
public List<jobs> searchjobs(@RequestParam String query) {
log.debug("REST request to search jobs for query {}", query);
String queryStatement = "SELECT * FROM jobs WHERE description like '%" + query + "%'";
log.info("Final SQL query {}", queryStatement);
ResultSet rs = null;
try (Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/SQL_DB", "root", "root");
PreparedStatement stmt = con.prepareStatement(queryStatement)) {
stmt.setString(1, query);
rs = stmt.executeQuery(queryStatement);
return extractjobs(rs);
} catch (SQLException ex) {
log.error(ex.getMessage(), ex);
return new ArrayList();
} finally {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException ex) {
log.error(ex.getMessage(), ex);
}
}
}
你錯過了准備好的聲明的本質。 使用它時,您將所有變量替換為這樣的占位符
String queryStatement = "SELECT * FROM jobs WHERE description like ?";
然后你可以像你一樣綁定查詢變量。 只需先將這些百分比字符添加到其中
stmt.setString(1, "%" + query + "%");
您可能已經閱讀過“使用准備好的語句來防止 SQL 注入”的常見建議。 但這個建議只是事實的一半。
完整的事實是,您應該使用查詢參數將不受信任的內容與您的查詢分開。 碰巧使用查詢參數需要您使用准備好的語句,因此您可以將准備步驟與執行步驟分開,並在這兩個步驟之間將參數綁定到准備好的查詢。
這有助於防止 SQL 注入,因為准備是在解析您的查詢時進行的。 如果在解析之前將不受信任的內容與查詢分開,那么不受信任的內容就不能引入 SQL 注入。
您的查詢沒有參數占位符。 您像以前一樣將不受信任的內容連接到語句中,這意味着它仍然存在 SQL 注入漏洞。
String queryStatement = "SELECT * FROM jobs WHERE description like '%" + query + "%'";
應該:
String queryStatement = "SELECT * FROM jobs WHERE description like ?";
由於您的查詢沒有參數占位符,因此當您嘗試綁定到它時應該會出錯:
stmt.setString(1, query);
這會拋出異常嗎? 你似乎記錄了它,所以檢查你的日志。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.