sonar java_修复Sonar中常见的Java安全代码冲突
sonar java
本文旨在向您展示如何快速修復(fù)最常見(jiàn)的Java安全代碼沖突。 它假定您熟悉代碼規(guī)則和違規(guī)的概念以及Sonar如何對(duì)其進(jìn)行報(bào)告。 但是,如果您以前從未聽(tīng)過(guò)這些術(shù)語(yǔ),則可以閱讀Sonar Concepts或即將出版的有關(guān)Sonar的書(shū) ,以獲取更詳細(xì)的解釋。 為了獲得一個(gè)想法,在Sonar分析期間,您的項(xiàng)目會(huì)被許多工具掃描,以確保源代碼符合您在質(zhì)量配置文件中創(chuàng)建的規(guī)則。 每當(dāng)違反規(guī)則時(shí)……就會(huì)引發(fā)違反。 使用Sonar,您可以通過(guò)違規(guī)深入視圖或在源代碼編輯器中跟蹤這些違規(guī)。 有數(shù)百條規(guī)則,根據(jù)其重要性進(jìn)行分類。 在以后的文章中,我將盡我所能覆蓋盡可能多的內(nèi)容,但現(xiàn)在讓我們來(lái)看一些常見(jiàn)的安全規(guī)則/違規(guī)行為。 我們現(xiàn)在要檢查兩對(duì)規(guī)則(在Sonar中它們都被列為關(guān)鍵)。
1.數(shù)組直接存儲(chǔ)( PMD ),方法返回內(nèi)部數(shù)組( PMD )
當(dāng)內(nèi)部數(shù)組存儲(chǔ)或直接從方法返回時(shí),會(huì)出現(xiàn)這些沖突。 以下示例說(shuō)明了違反這些規(guī)則的簡(jiǎn)單類。
public class CalendarYear {private String[] months;public String[] getMonths() {return months; }public void setMonths(String[] months) {this.months = months;} }為了消除它們,您必須先復(fù)制Array,然后再存儲(chǔ)/返回它,如以下類實(shí)現(xiàn)所示,因此沒(méi)有人可以修改或獲取類的原始數(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語(yǔ)句的執(zhí)行方法( findbugs ),并從非恒定字符串(findbugs )生成準(zhǔn)備好的語(yǔ)句
使用JDBC庫(kù)時(shí),這兩個(gè)規(guī)則都與數(shù)據(jù)庫(kù)訪問(wèn)有關(guān)。 通常,有兩種方法可以通過(guò)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);您可以通過(guò)三種不同的方法來(lái)克服此問(wèn)題。 您可以使用StringBuilder或String.format方法創(chuàng)建字符串變量的值。 如果適用,可以在類聲明中將SQL Commands定義為Constant,但這僅適用于不需要在運(yùn)行時(shí)更改SQL命令的情況。 讓我們使用StringBuilder重新編寫(xiě)第一個(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);對(duì)于第二個(gè)示例,您可以僅聲明sqlCommand,如下所示
private static final SQLCOMMAND = insert into customers (id, name) values (?, ?)';還有更多安全規(guī)則,例如阻止程序Hardcoded常量數(shù)據(jù)庫(kù)密碼,但我假設(shè)沒(méi)有人仍然在源代碼文件中對(duì)密碼進(jìn)行硬編碼…
在接下來(lái)的文章中,我將向您展示如何遵守性能和不良實(shí)踐規(guī)則。 在此之前,我一直在等待您的意見(jiàn)或建議。
祝您編程愉快,別忘了分享!
參考:在Only Only軟件問(wèn)題博客上,從我們的JCG合作伙伴 Papapetrou P. Patroklos 修復(fù)了Sonar中常見(jiàn)的Java安全代碼沖突 。
翻譯自: https://www.javacodegeeks.com/2012/09/fixing-common-java-security-code.html
sonar java
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的sonar java_修复Sonar中常见的Java安全代码冲突的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 女生电脑壁纸阿狸(阿狸超清电脑壁纸)
- 下一篇: 摩尔线程完成虚幻引擎 5 在国产显卡上的