我的位置: 首页 > 学习专区 > 网络工程 >
就业喜报更多 >
热点专题更多 >
热门标签更多 >
如何构建安全的Web应用程序
时间:2014-02-26 10:51:49   来源:
大家都在关注:
分享到:
[导读] 为存储口令和防止GPU破解程序和类似的资源暴露口令,我们建议结合三种主要技术:采用单向算法、加盐、有意利用慢速算法。

多年以来,安全专家们都在警告人们Web应用程序的漏洞,而这些警告往往会变成现实。我们经常看到这样的报道:黑客成功地渗透进入了一个Web应用。黑客或网络罪犯们也在共享新发现的漏洞,分享他们的成功故事或者对下一个目标的研究。我们不可能保证企业网络绝对无法渗透,而且黑客们已经证明了这一点,那么,为保障这些关键的企业应用,编程者应该做点儿什么呢?

本文讨论在以安全为中心的计算机编程时,如何构建低风险的基于Web的应用程序。

1.查询参数化

有许多针对Web应用程序的攻击可追溯到成功窃取了口令的SQL注入攻击。企业、政府、社交网站都成为这种攻击的受害者,这使其成为一个普遍的问题。虽然许多人认为这个问题是厂商问题,但从根本上讲这属于开发者的编程问题。

网页表单的评论框、数据字段或允许自由输入数据的表单区域,特别是开放性的字符串输入,都会导致这种漏洞。SQL注入攻击甚至可以通过非可见的Web元素 (如HTTP的header的值)来传递。恶意的SQL代码的简单插入,有时会导致整个数据库都有可能遭到窃取、清除或篡改,甚至被用来恶意地运行操作系统命令来破坏企业的数据库。

为阻止SQL注入,开发者必须防止非可信的输入被解析为SQL命令的一部分。阻止SQL注入的最佳方法是借助使用参数化查询的编程技术。

例如,在java标准中,可借助如下方法实现参数化查询:

String custname = request.getParameter("customerName");

String query = "_selectaccount_balance FROM user_data WHERE user_name = ? ";

PreparedStatement pstmt = connection.prepareStatement( query );

pstmt.setString( 1, custname);

ResultSet results = pstmt._executeQuery( );

2.保证口令存储的安全

显然,如果SQL注入可被用于窃取口令,就需要我们安全地保存用户口令。但为什么我们没有这样做?

保存口令的最糟糕的方法当然就是使用纯文本;但是,加密也不会好很多。原因在于加密是可逆的,还有一个原因就是MD5或者任何其它的哈希算法都是 有问题的。当今的黑客们可以访问强大但并非十分昂贵的计算资源,这可以使他们创建甚至购买“彩虹表”,从而可以实时地破译一般强度的密码。如今,黑客们甚至不再使用彩虹表,转而使用高性能的家用计算机去执行高速度的字典攻击。密码加盐技术是一种有助于对付彩虹表攻击和删除口令哈希重复数据的编码技术,但仅有这种技术是不够的。

利用有限的资源(如,利用并不昂贵的家用电脑),攻击者可以生成GPU破解程序,针对存储口令,它每秒钟可以执行250亿次口令尝试。

为存储口令和防止GPU破解程序和类似的资源暴露口令,我们建议结合三种主要技术:采用单向算法、加盐、有意利用慢速算法。有两个很好的算法,SCRYPT 和 PBKDF2可用来以这种形式安全地存储口令。