大部分的web应用程序会依靠客户端执行各种措施来控制它提交给服务器的数据,以提高程序的可用性,避免客户端与服务器来回通信。比如使用javascript来校验长度是否超长,格式是否正确,使用隐藏html表单字段进行数据传送,使用url参数传送数据等等。
但是,这样做存在一个基本的安全缺陷:用户能够完全控制客户端及提交的数据,即避开任何在客户端执行但服务器并不采用的控件,直接提交数据给服务器处理。
目前已经有大量的拦截代理服务器的工具。比如firefox的插件temper data,它位于web浏览器与目标应用程序之间,可以拦截应用程序发布和收到的每一个http或https请求和相应。我们通过它可以拦截任何客户端传递的消息,并且对其进行检查或修改,将修改过的内容传递给服务器进行处理。
拿一个简单的实例来说:对于一个输入框,长度限制为10,客户端通过了javascript进行校验,有一个maxlength=’10’,通常我们进行功能测试,会尝试输入10 字符和11个字符,超长之后会提示用户无法继续输入,我们认为该功能是正常的。然而,我们可以进一步进行测试:通过代理服务器来拦截这个请求,将内容改为长度为20的内容后继续提交,接着查看后端服务器应用是否提示错误信息,如果没有错误信息提示(有时数据库字段长度的设置稍微长一些),那说明这里是存在安全问题的。
对于以上安全问题的预防措施,对于重要敏感的信息,比如折扣、价格等,要放到服务器端传参与校验等,如果服务器端收到已被客户端阻止的数据,应用程序应将异常记录到日志中,在需要的时候向管理员发出警报来监控攻击企图。在某些重要敏感的功能中,应用程序还可以主动采取防御措施,终止用户会话或暂时冻结其账户。
综上所述,由于客户端组件和用户输入不在服务器的控制范围内,web应用程序会面临安全威胁。客户及其提交的数据本质上讲都是不值得信任的。确认客户生成数据的唯一安全方法是在应用程序的服务器端实施保护措施。