簡體   English   中英

這段代碼SQL Injection安全嗎?

[英]Is this piece of code SQL Injection safe?

這是否可以防止SQL注入,還是必須通過preparedStatement.setString()傳遞參數?

String sqlQuery = "select st from master where st_id= %1s ";

sqlQuery = String.format(sqlQuery, id);
preparedStatement = conn.prepareStatement(sqlQuery);
rs = preparedStatement.executeQuery();

這不是代碼審查,上面的代碼是該問題的示例。

您將直接在SQL代碼中嵌入用戶輸入:

String.format(sqlQuery, id)

有效地將用戶輸入作為代碼運行。 因此,不,這對於SQL注入是不安全的 這是SQL注入的定義。

與其直接將用戶輸入嵌入SQL代碼中,不如在預准備語句中使用參數將用戶輸入視為而不是代碼 本質上,查詢將變為:

String sqlQuery = "select st from master where st_id= ? ";

然后,您將使用該語言中的工具將參數值添加到查詢中:

preparedStatement = conn.prepareStatement(sqlQuery);
preparedStatement.setInt(1, id); // <--- here
rs = preparedStatement.executeQuery();

旁注:可能有人指出,如果id是非字符串類型,則此代碼對於SQL注入仍然是安全的,因為沒有人可以注入任何危險的東西(例如數字)。 雖然這可能對本任何給定的情況下根據情形真實的,它不能保證,但仍不能安全的做法。

始終將用戶輸入視為值,而不是代碼。 不管該輸入的類型如何,或者您如何確定您可能是該輸入的來源。 即使您想不出攻擊者利用它的任何方式,也不要給攻擊者任何攻擊的途徑。

暫無
暫無

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

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