[英]In prepared statement is setString() the only useful method to prevent SQL injection?
有什么需要使用:
pstatement.setInt();
pstatements.setFloat();
etc.
以及除setString()以外的所有其他方法(這是防止SQL注入的唯一有用方法)?
這很簡單,大多數數據庫與發送參數和執行語句分開准備語句。 語句和參數的這種分離實際上為防止SQL注入提供了保護(與手動轉義和連接查詢中的字符串相反)。 這些參數的發送格式通常特定於數據庫中的數據類型。
假設您在數據庫和Java中都使用了相同的類型(例如BIGINT
<> long
, VARCHAR
<> String
, TIMESTAMP
<> java.sql.Timestamp
),那么使用特定於類型的設置器將導致較少的轉換。 說int
> 4字節big-endian編碼,而不是String
> int
> 4字節big-endian編碼。
而且,它還可以減少代碼的混亂程度,因為您不需要首先從特定於Java的數據類型轉換為String
。
現在JDBC確實為許多數據庫類型支持setString
(有關轉換,請參見JDBC 4.2的附錄B),因此沒有什么可以阻止您僅使用setString
。 但是從易用性的角度來看,我不知道您為什么要這么做。 特定於類型的方法易於使用。
如果要在將輸入發送到要拒絕的數據庫之前對其進行驗證,則可以使用適當的“ set”語句,並在它們周圍放置try / catch塊。 這樣,您可以在向數據庫發送命令之前向用戶提供反饋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.