如何构建安全的Web应用程序

安全
黑客总能利用各种漏洞来进入Web应用程序。本文讨论在以安全为中心的计算机编程时,如何构建低风险的基于Web的应用程序。

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

[[108840]]

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

1.查询参数化

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

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

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

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

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

String query = "SELECT account_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可用来以这种形式安全地存储口令。

3.输出编码的XSS防御

跨站脚本攻击(XSS)有一个更合适的名字,即JavaScript劫持,它可被用于会话劫持、站点破坏、网络扫描、破坏CSRF防御、站点重定向或钓鱼、远程托管脚本的加载、数据窃取和击键记录等,而且,攻击者还越来越频繁地使用XSS。

输出编码是一种用于阻止XSS的关键编程技术,这种技术在输出时执行。在你构建用户界面时,这种编码可以在不可信的数据被动态添加到HTML之前的最后时刻执行。

首要的规则是拒绝所有,也就是不要将不可信任的数据放置到HTML文档中,除非满足特殊情况。最重要的是,千万不要接受来自不可信源的JavaScript代码。

4.内容安全策略

内容安全策略是一种新出现的浏览器标准。其基本理念在于创造一种标准化的框架,实现基于浏览器的保护,从而只需花费开发者用较少的工作就可以阻止XSS攻击。

为了使内容安全策略有效,嵌入到HTML中的所有JavaScript都需要清除,并部署在一个独立的外部JavaScript文件中。从这一点来看,如果能够理解内容安全策略的浏览器检测到了HTML文档中嵌入的JavaScript(例如,黑客试图插入这种脚本),该操作将被拒绝。这种做法能真正地锁定浏览器,防止许多形式的XSS攻击。

5.防止跨站脚本请求伪造

一旦用户登录进入了一个安全站点,然后打开了另一个标签并无意中登录了一个恶意网站,该问题站点可能包含有跨站请求,并充分利用用户已经登录进入的事实。然后,该恶意站点可能提交虚假请求,带来重大危害,如欺骗用户将金钱从银行网站转账。

为防止这类攻击,开发者需要考虑部署加密令牌,并要求用户重新进行身份验证才能完成交易,从而防止会话劫持。

6.多因素认证

许多人认为口令作为一种单一的认证因素已经死亡。更佳的认证方案是双因素或多因素认证。总是要求用户必须携带另一种设备才能验证身份是不现实的,所以这两种认证在过去已经有了很大的普及。虽然MFA的SMS和本地应用并不完美,但确实可以减少风险。许多消费者网站和其它网络服务现在提供多因素认证,如谷歌。

7.遗忘口令的安全设计

许多网站允许用户用简单的认证就可以请求原有口令或将新口令发送到一个注册的邮件地址。其实,更强健的过程应当是:用安全问题验证身份;通过带外方法(即SMS或令牌)向用户发送一个随机生成的密码;在同样的Web会话中验证代码并增强锁定策略;用户改变口令。

虽然上述步骤并不能根除现有的每个漏洞,也无法阻击所有的攻击要素,但这些措施却有助于强化网站和应用程序。

应用程序的编程者应当学会用安全方式编写代码。这是企业安装网站安全正确防御的唯一关键机会。

责任编辑:蓝雨泪 来源: TechTarget中国
相关推荐

2017-11-23 15:09:16

2016-01-24 22:14:51

2017-09-25 12:31:51

2012-04-19 09:34:21

ibmdw

2013-11-19 15:35:01

2011-02-13 14:36:35

2013-02-18 16:12:55

2012-05-14 17:35:28

移动Web

2009-02-27 17:00:25

2009-01-03 14:25:10

ibmdwWeb

2010-06-13 09:22:37

jQuery

2023-09-21 08:00:00

ChatGPT编程工具

2010-03-16 09:15:20

2024-01-02 00:18:56

Buffalo项目Go Web框架

2012-03-21 09:36:33

ibmdw

2009-09-22 12:59:07

ibmdwWeb

2017-12-10 14:13:14

云服务云原生应用程序

2017-03-02 11:10:39

AndroidMVVM应用程序

2022-02-21 14:41:21

APIWeb安全

2012-03-20 10:28:43

点赞
收藏

51CTO技术栈公众号