早上上班先扫了一眼csdn,其中新闻“2010最危险的编程错误”挺吸引我,于是深度之,感触颇深。
一、2010最危险的编程错误条目
1. 跨站点脚本攻击(4)
2. SQL注入(3)
3. 经典缓冲区溢出(1)
4. 跨站点请求伪造(7)
5. 不正确的访问控制(授权)
6. 在安全决策中依赖不可信的输入
7. 不正确地将路径名限制为受限路径
8. 上传危险类型的文件不受限
9. 操作系统命令中特殊因素的处理不正确(操作系统命令注入)(5)
10. 敏感信息未加密(6)
11. 使用硬编码凭据(21)
12. 以不正确的长度值访问缓冲区
13. PHP程序中Include/Require语句文件名控制不正确(PHP文件侵入)
14. 数组下标验证不正确
15. 异常条件检查不正确
16. 错误消息泄露信息(9)
17. 整数溢出
18. 缓冲区大小计算错误
19. 关键函数缺乏身份验证
20. 下载未经完整性检查的代码(15)
21. 对关键资源的错误权限分配(22)
22. 资源分配没有限制
23. URL重导向到不受信的资源
24. 使用被破解或有风险的加密算法(20)
25. 存在竞争情况(Race condition)(8)
其中后加括号有数字的,是该项错误去年的排名。显然,连续两年都入选的错误,千万不要再犯了。
二、25条编程错误之思考
1、高安全性web程序越来越难写
虽然现在编程语言越来越多、越来越先进、上手越来越容易,甚至完全利用拖拉、配置都可以完成程序编写,但是程序安全风险却越来越高,而且越来越隐蔽。这个,我们细想下也好理解,因为安全风险是可继承并且可放大的。比如说,优秀的html编辑器fckeditor,其有文件上传的漏洞,则只要你的web站点使用了fckeditor就有文件上传的漏洞,而此漏洞是极其隐蔽的。因此,对于对公的有数据交互的web开发,提高其安全性欲来欲困难,写程序的难度也越来越大,不是以前的数据通过web页面可提交保存到数据库并且能查询出来即可。
2、必须有一套强壮权限控制系统
现在做web系统,一定要有强壮的权限控制机制,不仅要控制url,更要控制函数、数据等资源。如表格所示的几条都是由于权限没控制好导致,因此要做一个web系统,其权限控制一定要强壮而且灵活。
5. 不正确的访问控制(授权) 22. 资源分配没有限制 21. 对关键资源的错误权限分配(22) 19. 关键函数缺乏身份验证 |
3、须有统一的错误处理机制
由于很多错误、异常都是不可预料的,因此即使程序员做了很多错误处理,测试的时候也都是被程序本身捕捉到了,但是用户使用的时候却不断地抛出其它的错误、异常,而且往往会暴露关键信息。诸如:jsp容器是tomcat,tomcat版本号是多少,数据库是oracle,table名称是什么,操作了table的哪些field等。因此,web开发必须进行统一的错误处理,程序员未自行处理的错误、异常,开发平台一定须处理掉。
4、关键性的数据录入、条件必须在服务端校验
数据校验很多开发人员都会考虑到而且也会处理,比如:*必须录入,长度要满足多少,类型必须是什么等等,但是大部分只是在前端js处理了下,就传给服务器端,服务器端直接提交了。跨站点脚本攻击、sql注入、跨站点请求伪造、在安全决策中依赖不可信的输入等如在服务器端校验,则可有效避免。
5、敏感信息一定要加密
敏感信息不仅在传输途中要加密,而且存储在数据库中也应加密,如登录口令等。