簡體   English   中英

帶有 SQL 查詢問題的准備好的語句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM