前几天帮公司写一些规范,刚写完的“锐奇网络网站建设规范之一:网站程序安全性”,可能非技术的人不太看的懂,不过我已经尽量写的通俗易懂了,因为我是写给测试工程师阅读的,不过我想发在这里,部分作为大家“网站诊断”时的参考,还是具有一些价值吧!
网站程序的安全是系统开发人员必须考虑的重要因数之一,因为这涉及到网站的建设者、网站用户的诸多安全问题,如果不处理好,可能会给系统的使用者和管理者带来严重问题。同时Web应用程序的安全解决方案不仅是技术问题,还涉及到管理等多个方面。但本文仅从四个最常见的、基本的、可通用的方面加以介绍,并对每个安全问题从:为什么、怎样解决、怎样检测三个层次以自问自答的方式加以通俗易懂的介绍。
其实此四种技术开发人员都可能使用过其中一种或者都使用过,但是有时我们在开发的过程中并没有特意的引起重视,在每一个细节的处理时未注意网站的安全性,结果可能导致一些安全漏洞。希望通过此文使开发人员能够更加注重系统安全性,尤其测试人员能够通过监督去保证系统的安全性,提高产品质量。
1 防止SQL注入技术
为什么必须防止SQL注入?
相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。新手最容易忽略的问题就是SQL注入漏洞的问题。用NBSI 2.0对网上的网站扫描,就能发现部分网站存在SQL注入漏洞,用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据。
怎样防止SQL注入?
比如URL、表单等提交信息时,通过一段防止SQL注入的过滤代码即可防止出错信息暴露,或者通过转向,当系统出错时转到一个提示出错的页面等。同时服务器权限设置是一个非常重要的方面,由于涉及到服务器的配置比较多,本文不介绍。
对于文本型输入,如果要进行检查,就得根据字段本身的性质进行。例如如果是年龄,就得限定必须是数字,大小必须限定在一个范围之间,比如说18-120之间。对于用户名,应该建立一个集合,这个集合里存放有被允许的字符,或被禁止的字符。
这里特别需要说明的一点是关于检查程序的问题。目前,程序对输入数据的检查是在前台通过客户端脚本完成的,这样攻击者很容易就可以绕过检查程序。建议采用前后台结合的方法,既可以保证效率,有可以提高安全性。
怎样测试程序已防止了SQL注入?
如http://www.XXX.com/jiaren.asp?ID=544,此网站用ID来传送数值,如果在ID数值后面加一个SQL敏感符号,英文单引号“’”,打开此链接,如果出现的是浏览器的默认出错提示,则需要设置浏览器,使其错误提示出现,方法为打开浏览器:选项—Internet选项—高级,在设置里找到显示友好的HTTP错误信息勾掉,确认后再刷新,如果此时出现了数据库出错的提示,如:Microsoft OLE DB Provider for ODBC Drivers 错误 ’80040e21’,那么说明本程序并没有防止SQL注入,反之如果只出现了如:“提醒您, URL有误,请与管理员联系”之类的提示,说明SQL已经防止了注入。检测表单方法如:如提交脚本,在输入框中输入特殊字符如:script_等,在此不再叙述,测试者可以在网上找到很多这样的方法。
2 验证码技术
为什么必须使用验证码?
普遍的客户端交互如留言本、会员注册等仅是按照要求输入内容,但网上有很多攻击软件,如注册机,可以通过浏览WEB,扫描表单,然后在系统上频繁注册,频繁发送不良信息,造成不良的影响,或者通过软件不断的尝试,盗取你的密码。而我们使用通过使用验证码技术,使客户端输入的信息都必须经过验证,从而可以解决这个问题。
怎样使用验证码技术?
所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素,由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。放在会员注册、留言本等所有客户端提交信息的页面,要提交信息,必须要输入正确的验证码,从而可以防止不法用户用软件频繁注册,频繁发送不良信息等。
怎样测试验证码是否有效?
必须保证所有客户端交互部分都输入验证码,测试提交信息时不输入验证码,或者故意输入错误的验证码,如果信息都不能交,说明验证码有效,同时在验证码输入正确下提交信息,如果能提交,说明验证码功能已完善。
3 密码加密技术
为什么必须使用密码加密?
没有经过MD5加密的密码直接显示在数据库表中,如果被黑客下载数据,查出数据库中的密码,或者内部开发人员通过数据库查出用户的密码,都对以后用户的信息安全造成很大的影响。如果使用MD5加密后的密码,在数据库中看到的是一连串经过加密的字符串,不能看到真正的密码,这样能更好地保护网站的安全。虽然黑客也可以使用暴力破解,但是我们再结合生成图片验证码技术,那暴力破解的难度就将大大增强。
怎样使用MD5加密技术?
MD5的全称是Message-Digest Algorithm 5,当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。
怎样测试密码已经加密?
凡是经过加密的密码,系统功能上多半有找回密码的功能,这是表面的测试,测试人员可以调用开发人员的数据表,查询是否经过加密,从而保证系统密码的安全,一般对具有大量会员的商业性网站必须使用。
4