张大发最近接受了一份C++的私服。在编程时,他需要生成一串由字母和数字混合而成的随机字符串。张大发不知如何是好,打开谷歌,输入关键词搜索,快速在StackOverflow上搜索。他找到了答案并附上相关代码。他心里暗喜,直接复制粘贴,稍微修改一下,问题就解决了,爽!这可能是很多程序员都做过的事情,但是一项研究表明这样做是有风险的。1近日,计算机科学研究小组在StackOverflow上研究了过去十年来的72,483个C++代码片段,发现了69个存在安全漏洞的代码片段,按照CWE(CommonWeaknessEnumeration)规范分为29类。从数量上看,69个非常少,不到总数的千分之一,但令人震惊的是,这69个存在安全漏洞的代码片段竟然出现在了2859个GitHub开源项目中!显然,这些代码是程序员从StackOverflow复制粘贴的。以文章开头的张胖子为例。他需要用C++生成一个随机的字母和数字混合的字符串,但是他不知道怎么做,于是他在StackOverflow上搜索,他找到了一个ID为440240的答案。这个答案有265个点赞,浏览量超过17万次。这应该是一个很好的答案!于是,张大发“动心”了,他认为这是一段很好的解决问题的代码,Copy,Paste!但是,这段代码有很大的坑。首先是字符串的长度。C/C++字符串以0结尾。带有“len”参数的函数应该考虑到这一点,但这段代码只是简单地设置了s[len]=0,这将导致不可预测的行为。其次,rand()函数已经是一个过时的函数,不应该被调用。即使使用,也应该先调用srand()设置一个随机数种子。第三,使用rand()%N尝试生成随机数并不是最佳实践,因为许多随机数生成器生成的数字在低阶上并不是真正随机的。看似简单的代码却有很多安全漏洞。如果贸然复制粘贴到自己的项目中,那就是地雷。2其实如果张大胖稍微细心一点,就会看到这个答案有几条评论:其实已经有人指出了代码的错误,Velkan也明确表示StackOverflow应该提供一种机制使这些过时的和废弃的答案“沉没”下来,所以我不能在这里误导大家。但是有多少Copy&Paste程序员会仔细阅读这些注释呢?这个课题组的科学家很贴心,专门开发了一个Chrome插件。当程序员检查这些有安全漏洞的代码时,插件会提示:这段代码存在安全漏洞!试图防止复制粘贴并提供指向更好解决方案的链接。3研究团队的科学家就这些安全漏洞联系了GitHub项目的开发人员。根据反馈,只有13.3%的人表示已经修复,40%的人承认存在这些漏洞的可能性,但他们认为输入的数据不是动态的,不存在安全风险。有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#440240http://c-faq.com/lib/randrange.html
