修复Sonar中常见的Java安全代码冲突
為了獲得一個(gè)想法,在Sonar分析期間,您的項(xiàng)目會(huì)被許多工具掃描,以確保源代碼符合您在質(zhì)量配置文件中創(chuàng)建的規(guī)則。 每當(dāng)違反規(guī)則時(shí)…就會(huì)引發(fā)違反。 使用Sonar,您可以通過違規(guī)深入視圖或在源代碼編輯器中跟蹤這些違規(guī)。 有數(shù)百條規(guī)則,根據(jù)其重要性進(jìn)行分類。 在以后的文章中,我會(huì)盡我所能覆蓋盡可能多的內(nèi)容,但現(xiàn)在讓我們來看一些常見的安全規(guī)則/違規(guī)行為。 我們現(xiàn)在要檢查兩對規(guī)則(在Sonar中它們都被列為關(guān)鍵)。
1.數(shù)組直接存儲(chǔ)( PMD ),方法返回內(nèi)部數(shù)組( PMD )
當(dāng)內(nèi)部數(shù)組存儲(chǔ)或直接從方法返回時(shí),會(huì)出現(xiàn)這些沖突。 以下示例說明了違反這些規(guī)則的簡單類。
public class CalendarYear {private String[] months;public String[] getMonths() {return months; }public void setMonths(String[] months) {this.months = months;} }要消除它們,您必須在存儲(chǔ)/返回它之前克隆Array,如以下類實(shí)現(xiàn)所示,因此沒有人可以修改或獲取您類的原始數(shù)據(jù),而只能修改它們的副本。
public class CalendarYear {private String[] months;public String[] getMonths() {return months.clone(); }public void setMonths(String[] months) {this.months = months.clone();} }
2.傳遞給SQL語句( findbugs )上的execute方法的非恒定字符串,并從非恒定String (findbugs )生成準(zhǔn)備好的語句
使用JDBC庫時(shí),這兩個(gè)規(guī)則都與數(shù)據(jù)庫訪問有關(guān)。 通常,有兩種方法可以通過JDBC連接執(zhí)行SQL Commants:Statement和PreparedStatement。 關(guān)于優(yōu)缺點(diǎn),有很多討論,但這超出了本文的范圍。 讓我們看看如何根據(jù)以下源代碼片段引發(fā)第一次違規(guī)。
Statement stmt = conn.createStatement(); String sqlCommand = 'Select * FROM customers WHERE name = '' + custName + '''; stmt.execute(sqlCommand);您已經(jīng)注意到傳遞給execute方法的sqlcommand參數(shù)是在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建的,此規(guī)則不接受。 類似情況會(huì)導(dǎo)致第二次違規(guī)。
String sqlCommand = 'insert into customers (id, name) values (?, ?)'; Statement stmt = conn.prepareStatement(sqlCommand);您可以通過三種不同的方法來克服此問題。 您可以使用StringBuilder或String.format方法來創(chuàng)建字符串變量的值。 如果適用,可以在類聲明中將SQL Commands定義為Constant,但這僅適用于不需要在運(yùn)行時(shí)更改SQL Command的情況。 讓我們使用StringBuilder重新編寫第一個(gè)代碼段
Statement stmt = conn.createStatement(); stmt.execute(new StringBuilder('Select FROM customers WHERE name = '').append(custName).append(''').toString());并使用String.format
Statement stmt = conn.createStatement(); String sqlCommand = String.format('Select * from customers where name = '%s'', custName); stmt.execute(sqlCommand);對于第二個(gè)示例,您可以僅聲明sqlCommand,如下所示
private static final SQLCOMMAND = insert into customers (id, name) values (?, ?)';還有更多安全規(guī)則,例如阻止程序Hardcoded常量數(shù)據(jù)庫密碼,但是我認(rèn)為沒有人仍然在源代碼文件中對密碼進(jìn)行硬編碼…
在接下來的文章中,我將向您展示如何遵守性能和不良實(shí)踐規(guī)則。 在此之前,我一直在等待您的意見或建議。
祝您編程愉快,別忘了分享!
參考:在Only Only軟件問題博客上,從我們的JCG合作伙伴 Papapetrou P. Patroklos 修復(fù)了Sonar中常見的Java安全代碼沖突 。
翻譯自: https://www.javacodegeeks.com/2012/09/fixing-common-java-security-code.html
總結(jié)
以上是生活随笔為你收集整理的修复Sonar中常见的Java安全代码冲突的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux的if语句时间判断(linux
- 下一篇: Java:选择正确的集合