在编程中,有哪些原则和做法,可以提升程序或构架的安全性

谢邀~Web应用安全:1.整体安全性取决于良好的方案设计、授权与访问控制手段的落地以及运维管理,如采用三层架构、对外暴露的端口仅限Web端口、配置用户上传目录仅限静态解析而不是传递给应用服务器、禁止外网运维、超级帐号的回收、消除弱口令、应用管理/系统管理/数据管理三权分立;2.尽量选用安全的框架(中间件),经过实践考验筛选出来的框架,在安全性上有所考虑(如默认为Form启用CSRF Token、展示用户提交的数据时会进行转义等),相对于自己从头造轮子来说会节省很多时间,当然也有出现0day漏洞的可能性;3.数据库操作尽量使用ORM框架而不是自己写SQL,特别是新手,新手写SQL语句往往不熟悉预编译机制,只是简单模仿教科书里面的拼接写法,从而指令和数据不分,引入非法数据污染了指令;4.不信任原则:所有的接口,都不能信任外部传递过来的任何数据,适当的校验会降低恶意数据侵入的风险,即使该数据是另外一台服务器传递过来的;5.遵守业界最佳实践和约定俗成的规则,如接口清晰明确,模块间低耦合,该用POST的时候绝对不能用GET,读取文件时不要把文件名当作参数传递等等;6.必要的敏感字段加密(在应用层加密后写入);7.作为数据源提供给其它业务时,是否以最小化的视图提供或已经过滤掉无关数据;8.业务安全设计上,交易类是否形成完整的证据链,以及事务完整性校验;9.外部防御措施(硬件防火墙策略、WAF保护纳入等等);...网络应用客户端1.遵守常见的架构原则,不能出现客户端直接访问数据库服务器的场景;2.不信任原则:所有的接口,包含但不限于WebView、自定义函数接口、第三方组件接口等,都不能信任外部传递过来的任何数据,适当的校验会降低恶意数据侵入的风险;3.校验服务器:仅仅把数据发给某个域名,不代表数据真的发送到了正确的地方,要考虑劫持的场景并加上验证服务器的机制;4.避免在客户端明文存储用户的认证凭据;5.客户端自身的完整性校验(是否被替换或篡改);6.避免使用含有漏洞的第三方组件;...谨以个人经验列举,其中有些条目不是开发/编程所涉及到的,但个人感觉比较重要,也放在这里了。个人微信公众号:网络安全生命周期 (Security_SDL),欢迎共同探讨~
■网友
拥有良好的编码习惯(编码可读性高可以提高安全审计工作者的效率,并且良好的习惯包括使用安全的函数,对于参数 字符串的控制等)在可以的情况下开源(这个不由分说,大家一起找安全问题肯定比一个人找快)关注安全咨询信息(能够及时了解自己项目可能出现的0day 及时修补)能做到这些 就已经很不错了:) 其他的想到再补。
■网友
谢邀首先,应该引用安全开发生命周期,微软的SDL不错,文档和工具都可以免费使用,利用得当在架构和代码安全性上回有明显提升。其次,在软件设计时有一些基本的安全原则也是必须要遵守的,特别是在架构设计阶段。1.最小特权,2.权限分离,3.最少共享机制,4.不信任原则,5.默认故障处理保护,6.纵深防御。依照这些原则,在软件设计时可尽量减少安全风险,具体技术科自行搜索。然后,在编码环节一些通用安全编码准则可以借鉴。1.输入验证,2.边界安全,3.异常安全处理,4.最小化反馈,5.临时文件安全,6.组件安全,7.返回值安全,8.数据传递安全。具体技术前人已经写了很多,不再赘述。特别要说的是,web程序中I/O处理是最容易出现问题的地方,缓冲区溢出、跨站脚本、注入基本都在这。还有就是在会话控制和访问控制方面易出现逻辑漏洞,未授权访问、信息泄露基本在这。最后,所有产品完成后都应该进行安全测试,最好渗透测试和源代码审计都做。
■网友
好吧,第一次收到邀请。从我做逆向的角度来说吧。如果要提高安全性,那么可以加壳(VMP类型的),加混淆,加反调试,加反虚拟机。这样都会给逆向带来困难,因此从代码方面找到攻击点就比较困难。从正向角度来看,编码方面要保证安全性,就是通常所说的那些,野指针,边界考虑,字符过滤等一些常见的问题。整体框架的安全性方面,个人了解就是良好的设计,多模块,低耦合,其他暂不了解。


推荐阅读