我知道SQL注入是其中一种...还有其他的吗...
我知道SQL注入是其中一种...还有其他的吗...
虽然其他人也说过这个观点,但是...
基本上所有的安全漏洞都源于数据。如果你的程序没有处理任何数据,那么它很可能是安全的。但同时也很可能毫无用处 :)
这导致了我认为保证代码安全的核心概念:
永远不要信任你的数据。
对一切可能的情况进行数据过滤。虽然你可以依赖平台提供的安全保证(例如,在像Java或者C#这样的托管语言中,几乎不可能出现基于字符串的缓冲区溢出),但是除此之外,你需要验证每一个进入应用程序的数据。
不要储存明文密码。我曾经为公司评估了很多商业软件,其中有些确实储存了明文密码,并且当我指出问题时还显得毫不在意。我的最爱是一个客户关系管理供应商的借口:“你的终端用户通常会在他们的桌面上安装Enterprise Manager或Query Analyzer吗?”
在处理之前,请对程序的所有输入进行消息传递和过滤。
不要在没有过滤和截断的情况下处理输入。
-R
虽然这是与 Web 相关的内容,但由于您没有限制范围……
JavaScript 注入。如果您允许从任何来源输入任何内容,在某个输出位置输出时可能会键入 JavaScript,而当它在输出时(除非经过适当的编码/解码),否则将输出原始 JavaScript。
编程时要保持防御性。对于每个函数/方法/过程/子程序,考虑“期望的输入是什么?当输入偏离期望时该怎么办?如何最轻松地确保输入不会偏离期望。”了解你的输入和输出。不要过度,但也要理解数据库中的数据可能已经被破坏。如果特定的一组数据可以以某种特定方式受到限制,则选择数据类型和变量以适应该方式。保持数字为数字。
每当我在程序中看到一个字符串对象时,我总是戏谑地问:“如果这个字符串包含吉尔伯特和沙利文歌曲的歌词会发生什么?”简单的if-else检查和在函数开头的过早返回语句可以防止这种事情在后面造成混乱。
我喜欢使用威胁建模工具来建模我的系统。这个特定的工具可以让你对不同的应用程序进行建模,并根据模型提供各种类型的威胁信息以及一些缓解措施和它们的风险。它还可以让你在开发生命周期中跟踪这些风险,制定缓解计划。这很酷。 :)