编写代码时需要考虑哪些安全问题?

3

我知道SQL注入是其中一种...还有其他的吗...


1
提供更多细节(语言、架构)将会非常有帮助。 - Chris Marasti-Georg
15个回答

18

11

虽然其他人也说过这个观点,但是...

基本上所有的安全漏洞都源于数据。如果你的程序没有处理任何数据,那么它很可能是安全的。但同时也很可能毫无用处 :)

这导致了我认为保证代码安全的核心概念:

永远不要信任你的数据。

对一切可能的情况进行数据过滤。虽然你可以依赖平台提供的安全保证(例如,在像Java或者C#这样的托管语言中,几乎不可能出现基于字符串的缓冲区溢出),但是除此之外,你需要验证每一个进入应用程序的数据。


6

不要储存明文密码。我曾经为公司评估了很多商业软件,其中有些确实储存了明文密码,并且当我指出问题时还显得毫不在意。我的最爱是一个客户关系管理供应商的借口:“你的终端用户通常会在他们的桌面上安装Enterprise Manager或Query Analyzer吗?”


3
这里是十大安全编码实践的清单(点击链接)。作为一个好的起点。特别关注第8条,深度防御。

我发现“深度防御”经常被用作对某个层面的漏洞的借口。“那是一个漏洞。”“是的,但我不会修复它,因为我们实行深度防御。”其实并没有深度;应该将每个层面单独考虑。 - erickson
是的,这听起来像是一层顶部有污垢的防御。 - Flory

2

在处理之前,请对程序的所有输入进行消息传递和过滤。

不要在没有过滤和截断的情况下处理输入。

-R


更一般地说,不要相信用户。 - Ryan Guest

1

缓冲区溢出是经典的C语言编程问题,因为它们通常允许攻击者执行任意代码。


1

虽然这是与 Web 相关的内容,但由于您没有限制范围……

JavaScript 注入。如果您允许从任何来源输入任何内容,在某个输出位置输出时可能会键入 JavaScript,而当它在输出时(除非经过适当的编码/解码),否则将输出原始 JavaScript。


1

1

编程时要保持防御性。对于每个函数/方法/过程/子程序,考虑“期望的输入是什么?当输入偏离期望时该怎么办?如何最轻松地确保输入不会偏离期望。”了解你的输入和输出。不要过度,但也要理解数据库中的数据可能已经被破坏。如果特定的一组数据可以以某种特定方式受到限制,则选择数据类型和变量以适应该方式。保持数字为数字。

每当我在程序中看到一个字符串对象时,我总是戏谑地问:“如果这个字符串包含吉尔伯特和沙利文歌曲的歌词会发生什么?”简单的if-else检查和在函数开头的过早返回语句可以防止这种事情在后面造成混乱。


1

我喜欢使用威胁建模工具来建模我的系统。这个特定的工具可以让你对不同的应用程序进行建模,并根据模型提供各种类型的威胁信息以及一些缓解措施和它们的风险。它还可以让你在开发生命周期中跟踪这些风险,制定缓解计划。这很酷。 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接