发布于 2016-08-04 13:24:18
在任何语言、任何时间都有可能不安全,只有开发人员的注意力/意识才能解决这个问题。SQL注入是仍然是一件事。高级语言通常都有eval
,如果你笨到可以让用户输入,你就会得到你得到的东西。
话虽如此,但情况正好相反。垃圾收集可以避免与内存管理(如缓冲区溢出)相关的整个安全风险。更高层次的语言往往更简洁,更少的代码意味着更少的地方可以隐藏bug。任何乏味的事情(当然是用低级语言编写代码)都很容易出错。
因为低级语言缺乏同样的表现力,所以不仅在开始的时候,而且在整个代码库中都要编写大量的样板代码。这意味着,从一瞥中就能看出代码应该做什么并不总是那么容易(在业务逻辑上),这意味着它将减少自文档化,需要更多的注释或外部文档形式的文档。这就引入了另一个错误来源:如果文档在它引用的代码更改时没有更新,那么您可以编写其他由于相关代码文档中过时的假设而不安全的代码。
低级语言缺乏强类型,所以编译器可以捕获的错误较少.有一些有趣的尝试,如尼姆和生锈来解决这一问题,但这两种尝试都还不流行。
最后,但同样重要的是,高级语言和低级语言之间的真正区别在于,高级语言将负担从程序员转移到了解释器/编译器。这些解释器/编译器是由行业中一些最耀眼的灯编写和维护的,通常会对漏洞等进行审计。另一方面,应用程序代码是由凡人编写的。因此,将负担从普通程序员编写的大量应用程序代码转移到由优秀程序员编写的相对较少的代码,应该可以提高安全性,因为由更有能力的人编写的代码更少。那么,您更愿意相信哪个,JVM还是Joe的手动缓冲区管理在C中?
所有这些都回避了一个问题,为什么人们仍然使用低水平的语言,如果他们更难使用,不那么安全。有以下几个原因:
1) 金锤。“我们有一群C程序员,奇怪的是,我们所有的代码都是用C编写的。”
2)绩效。这通常是一种“红鲱鱼”,它几乎不值得在安全和发展速度上进行权衡,但在像游戏这样的游戏中,你需要从硬件中获取每一点好处,这是有意义的。
( 3)平台模糊。按照上面的思路,编写C编译器比编写Rust编译器或JVM要容易得多。如果您必须首先实现编译器,从C开始看起来更有吸引力。
https://security.stackexchange.com/questions/132923
复制相似问题