面向Google編程的Copy&Paste程序員要小心了!
張大胖最近接了一個C++的私活,在編程的時候需要生成一個字母和數(shù)字混合的隨機字符串,張大胖不知道該怎么辦,于是打開Google,輸入關(guān)鍵字搜索,迅速在Stack Overflow找到了答案,還附有相關(guān)代碼,他心中竊喜,直接復(fù)制粘貼過來,稍加修改,問題搞定,爽!
這可能是很多程序員都干過的事情,但是一個研究顯示這么做是有風(fēng)險的。
1
最近一個計算機科學(xué)研究小組研究了Stack Overflow上過去十年的72483個C++代碼片段,發(fā)現(xiàn)了69個有安全缺陷的代碼片段,按照CWE (Common Weakness Enumeration) 的規(guī)范,被分成29類。
從數(shù)量上來看,69個非常少,總數(shù)量的千分之一都不到,但是讓人震驚的是這69個有安全缺陷的代碼片段又出現(xiàn)在了2859個GitHub的開源項目中!
很明顯,這些代碼都是程序員從Stack Overflow 復(fù)制粘貼過去的。
拿文章開頭張大胖的例子來講, 他需要用C++生成一個字母數(shù)字混合的隨機字符串,但是不知道怎么辦,于是就到Stack Overflow上去搜索,他找到了一個ID為440240的答案,這個答案有265個贊同,被瀏覽了17萬多次,應(yīng)該是個好答案了吧!
于是,張大胖“動心”了,他認為這是一段能解決問題的好代碼,Copy , Paste 吧!
然而這段代碼是存在著大坑的。
首先是字符串長度的問題,C/C++字符串以0結(jié)尾,帶有'len'參數(shù)的函數(shù)應(yīng)該把這一點考慮進來,但是這段代碼只是簡單的設(shè)置 s[len]=0 ,這就會導(dǎo)致不可預(yù)料的行為。
其次rand()函數(shù)已經(jīng)是一個過時的函數(shù)了,不應(yīng)該被調(diào)用了,即使是被使用,也應(yīng)該先調(diào)用srand()設(shè)置一個隨機數(shù)種子。
第三,使用rand() % N 試圖來產(chǎn)生一個隨機數(shù)字也不是最佳實踐,因為很多隨機數(shù)生成器生成數(shù)字的低字節(jié)并不是真正隨機的。
看起來很簡單的代碼卻有很多安全的漏洞,如果貿(mào)然復(fù)制粘貼到自己的項目中,就是埋了一個地雷。
2
其實,如果張大胖稍微細心一點,他就會看到這個答案有這么幾個評論:
實際上已經(jīng)有人指出代碼的錯誤了,Velkan還明確地說,Stack Overflow應(yīng)該提供一種機制,讓這些過時的、廢棄的答案“沉”下去,不能在這里誤導(dǎo)大家了。
但是有多少Copy&Paste程序員會細心地看這些評論呢?
這個研究小組的科學(xué)家們非常貼心,專門開發(fā)了一個Chrome插件,當(dāng)程序員去查看這些有安全缺陷的代碼時,插件就會提示:這段代碼有安全漏洞! 試圖阻止復(fù)制粘貼,并且提供一個更好的解決方案的鏈接。
3
研究小組的科學(xué)家們就這些安全漏洞聯(lián)系了GitHub項目的開發(fā)人員, 從回復(fù)來看,只有13.3%的人說他們已經(jīng)Fix了,有40%的人承認這些漏洞的可能性,但是他們認為輸入數(shù)據(jù)不是動態(tài)的,沒有安全風(fēng)險。還有13.3%的人根本不愿意修改。可見安全問題任重而道遠啊!
希望能給Copy & Paste程序員敲響一次警鐘吧!
參考資料:
https://arxiv.org/pdf/1910.01321.pdf?
https://stackoverflow.com/questions/440133/how-do-i-create-a-random-alpha-numeric-string-in-c/440240#440240
http://c-faq.com/lib/randrange.html