[英]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注入。 然后,您可以針對數據庫中的已知表和列對TABLENAME
和ATTRIBUTENAME
進行驗證。
請參閱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.