簡體   English   中英

准備的語句/ sql-injection防止變量來自

[英]prepared statement / sql-injection preventation on variable from

我了解到,准備語句是避免將sql注入數據庫的好方法。 問題是客戶想要一個安靜的可變UI,他首先選擇一個表,然后選擇由列和文本組成的約束。 因此,基本上(天真的)最終產品將如下所示:

Select * from %TABLENAME% where %ATTRIBUTENAME% = %VALUE%

現在的問題是如何確保此安全?

當然,我可以構建一個prepare Statement解決方案,在該解決方案中我為所有表預先創建語句,但這對我來說聽起來像個很愚蠢的主意,因為維護該語句的工作量很大(客戶有幾個表很安靜) )。 知道如何以盡可能通用的安全方式解決此問題嗎?

您應該將示例更改為

select * from %TABLENAME% where %ATTRIBUTENAME% = ?

這樣至少VALUE不能用於SQL注入。 然后,您可以針對數據庫中的已知表和列對TABLENAMEATTRIBUTENAME進行驗證。

請參閱DatabaseMetaData.getColumns(...) ,您可以在運行時進行驗證。 或者,也許您可​​以保留一個在生成時生成的帶有有效表/列的靜態文件。

您可以在構建時為每個表/列組合生成一個Enum嗎? 我知道jOOQ可以通過數據庫模式生成這種構建時間的Java代碼...也許可以幫上忙?

例如

public enum TableColumn {
    CUSTOMER_NAME("customer", "name"), CUSTOMER_ID("customer", "id"),
    ORDER_ID("order", "id"), // etc etc

    String table;
    String column;

    public TableColumn(String table, String column) {
        // set values
    }
}

public List<Row> doSelect(TableColumn tc, Object value) {
    String sql = String.format("select * from %s where %s = ?", tc.table, tc.column);
    Connection con = getConnection();
    try {
        PreparedStatement ps = con.prepareStatement(sql);
        ps.setObject(1, value);
        ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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