簡體   English   中英

在准備好的語句中,setString()是防止SQL注入的唯一有用的方法嗎?

[英]In prepared statement is setString() the only useful method to prevent SQL injection?

有什么需要使用:

    pstatement.setInt();  
    pstatements.setFloat(); 
    etc.

以及除setString()以外的所有其他方法這是防止SQL注入的唯一有用方法)?

這很簡單,大多數數據庫與發送參數和執行語句分開准備語句。 語句和參數的這種分離實際上為防止SQL注入提供了保護(與手動轉義和連接查詢中的字符串相反)。 這些參數的發送格式通常特定於數據庫中的數據類型。

假設您在數據庫和Java中都使用了相同的類型(例如BIGINT <> longVARCHAR <> StringTIMESTAMP <> 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.

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