如何开发安全的Web应用

2014-09-30 MetInfo

 

  开发出一个Web应用程序不难,难的是如何开发安全的Web应用。我们经常看到这样的报道:黑客成功地渗透了一个Web应用。黑客或网络罪犯们也在共享新发现的漏洞,分享他们的成功故事或者对下一个目标的研究。我们不可能保证Web应用程序无法渗透,黑客们已经证明了这一点,那么,该如何保障这些重要的Web应用程序呢?
 
1.查询参数化
  有许多针对Web应用程序的攻击可追溯到SQL注入攻击。企业、政府、社交Web应用都成为这种攻击的受害者,这使其成为一个普遍的问题。虽然许多人认为这个问题是厂商问题,但从根本上讲这属于开发者的开发问题。
 
  网页表单的输入框、数据字段或允许自由输入数据的表单区域,特别是开放性的字符串输入,都会导致这种漏洞。SQL注入攻击甚至可以通过非可见的Web元素(如HTTP的header的值)来传递。简单插入恶意的SQL代码,有时会导致整个数据库遭到窃取、清除或篡改的可能,甚至被恶意地运行操作系统命令来破坏企业的数据库。
 
  为阻止SQL注入,开发者必须防止非可信的输入被解析为SQL命令的一部分。阻止SQL注入的最佳方法是借助使用参数化查询的编程技术。
 
2.保证密码的安全
  显然,如果SQL注入可被用于窃取密码,就需要我们安全地保存用户密码。但为什么我们没有这样做?
 
  保存密码的最糟糕的方法当然就是使用纯文本,但是,加盐也不会好很多。原因在于加盐是可逆的,还有一个原因就是MD5或者任何其它的哈希算法都是有问题的。当今的黑客们可以访问强大但并非十分昂贵的计算资源,这可以使他们创建甚至购买“彩虹表”,从而可以实时地破译一般强度的密码。如今,黑客们甚至不再使用彩虹表,转而使用高性能的家用计算机去执行高速度的字典攻击。密码加密技术是一种有助于对付彩虹表攻击和删除密码哈希重复数据的编码技术,但仅有这种技术是不够的。
 
  利用有限的资源,攻击者可以生成GPU破解程序,针对存储密码,它每秒钟可以执行250亿次密码尝试。
 
  为存储密码和防止GPU破解程序和类似的资源暴露密码,我们建议结合三种主要技术:采用单向算法、加盐、有意利用慢速算法。有两个很好的算法,SCRYPT和PBKDF2可用来以这种形式安全地存储密码。
 
3. 输出编码的XSS防御
 
  跨站脚本攻击(XSS)有一个更合适的名字,即JavaScript劫持,它可被用于会话劫持、站点破坏、网络扫描、破坏CSRF防御、站点重定向或钓鱼、远程托管脚本的加载、数据窃取和击键记录等,而且,攻击者还越来越频繁地使用XSS。
 
  输出编码是一种用于阻止XSS的关键编程技术,这种技术在输出时执行。在你构建用户界面时,这种编码可以在不可信的数据被动态添加到HTML之前的最后时刻执行。
 
  首要的规则是拒绝所有,也就是不要将不可信任的数据放置到HTML文档中,除非满足特殊情况。最重要的是,千万不要接受来自不可信源的JavaScript代码。
 
4. 内容安全策略
 
  内容安全策略是一种新出现的浏览器标准。其基本理念在于创造一种标准化的框架,实现基于浏览器的保护,从而只需花费开发者用较少的工作就可以阻止XSS攻击。
 
  为了使内容安全策略有效,嵌入到HTML中的所有JavaScript都需要清除,并部署在一个独立的外部JavaScript文件中。从这一点来看,如果能够理解内容安全策略的浏览器检测到了HTML文档中嵌入的JavaScript(例如,黑客试图插入这种脚本),该操作将被拒绝。这种做法能真正地锁定浏览器,防止许多形式的XSS攻击。
 
5. 防止跨站脚本请求伪造
 
  一旦用户登录了一个安全站点,然后打开了另一个链接并无意中登录了一个恶意Web应用,该问题站点可能包含有跨站请求。然后,该恶意站点可能提交虚假请求,带来重大危害,如欺骗用户将金钱从银行Web应用转账。
 
  为防止这类攻击,开发者需要考虑部署加密令牌,并要求用户重新进行身份验证才能完成交易,从而防止会话劫持。
 
  虽然上述步骤并不能根除现有的每个漏洞,但这些措施却有助于提升Web应用的安全性。
 
  Web应用开发者需要开发即好用又安全的Web应用,如果您想了解更多关于Web应用开发的知识,可以关注MetInfo官方开展的免费培训,详情请查看:Web应用开发培训