【121】 解析API 接口

时间:2024-10-26 08:07:00

内容目录(原文见公众号python宝)

一、接口测试的相关内容二、什么是接口测试?三、API介绍               3.1 REST 介绍        3.2 RESTful API介绍        3.3 四、API 安全测试

一、接口测试的相关内容

 经常有后端开发会问,后端接口都测试什么?怎么测?简单梳理了一下接口测试的相关内容:

二、什么是接口测试?  

        模拟客户端向服务器发送报文请求,服务器接收请求报文后对相应的报文做处理并向客户端返回应答,客户端接收应答的一个过程。主要有两大类:

  • 代码内部接口调用,代码A与代码B在组合的时候,必然需要定义一些名称以及参数、类型,这种在测试中一般划分在白盒测试中,对内部逻辑进行测试,目前未接触。

  • 系统与系统之间,通过网络数据的传递进行交互,这种在测试中一般划分在黑盒测试中,也就是看不到代码,但可以通过各种手段将网络数据发送到接口从而得到接口的响应信息,达到测试的目标。

举例:

  • 1. 12306是一个网站,所有的数据都在12306上。12306提供一整套接口,调用接口我们就可以获取到里面的数据。比如:在携程/艺龙等第三方上购买票,实际就是调用了12306提供的接口获取库存等信息;

  • Windows是一个封装好的系统,按道理用户是没有权在Windows里头干任何事的,但是Windows提供了一整套的接口,调用接口我们可以操作Windows做出一些行为;

        利用接口,可以对一个封装好的整体进行操作,包括获取、操作数据。类库就是提供的一整套接口,类库提供的各个方法/函数等类成员,就是各个接口,平常写的类也算是提供了接口,类是整体,类的成员函数就是接口。

三、API介绍

        API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

        简单的说,就是通过某一预先定义的渠道读/写数据的方式。

3.1 REST 介绍

        REST是Web服务的一种架构风格,一种设计风格,是一种思想,非协议也非规范。

        简单看一下传统API设计以及REST API设计:

        非REST设计:

        http://localhost:8080/admin/getUser (查询用户)

        http://localhost:8080/admin/addUser (新增用户)

        http://localhost:8080/admin/updateUser (更新用户)

        http://localhost:8080/admin/deleteUser (删除用户)

        结论:以不同的URL(主要为使用动词)进行不同的操作。

        REST架构:

        GET http://localhost:8080/admin/user (查询用户)

        POST http://localhost:8080/admin/user (新增用户)

        PUT http://localhost:8080/admin/user (更新用户)

        DELETE http://localhost:8080/admin/user (删除用户)

     结论:URL只指定资源,以HTTP方法动词进行不同的操作。用HTTP STATUS/CODE定义操作结果。

3.1 RESTful API

        REST,全称是 Resource Representational State Transfer,通俗来讲就是,资源在网络中以某种表现形式进行状态转移。分解开来:

  • Resource:资源,即数据(前面说过网络的核心)。比如 newsfeed,friends等;

  • Representational:某种表现形式,比如用JSON,XML,JPEG等;

  • State Transfer:状态变化。通过HTTP动词实现。

        RESTful API 就是符合 REST 风格的 API,传递数据也是2种形式:

  • XML,少见

  • json,常见,现在 Web 应用基本使用这种形式的 API。

        rest api 前后端分离最佳实践,是开发的一套标准或者说是一套规范,不是框架。好处:


        1、轻量,直接通过http,不需要额外的协议,通常有post/get/put/deletec操作。
        2、面向资源,一目了然,具有自解释性
        3、数据描述简单,一般通过json或者xml做数据通讯

四、API 安全测试

4.1 逻辑越权类

        这里可以分两种:

        平行越权:权限类型不变(常见的增删改查),权限对象改变;

        垂直越权:权限对象不变,权限类型改变(常见的增删改查);

        举个例子,通过查看请求返回的数据,查看是否通过修改表示身份的字段来做跨权限请求;比如用户个人信息页,是否能通过字段自增去遍历别的用户信息;还有就是某个功能只有A权限用户可以使用,通过接口传B权限用户,验证是否能使用该功能;

4.2 输入控制类

        XXE,Restful API 的注入漏洞,XSS,溢出,特殊字符的处理;

        比如,在请求中,把某个字段的值加上两个单引号(’),看是否能够提交到数据库当中,如果能够提交到数据库,那么就存在SQL注入漏洞;

        或者字段中包含“<script>alert(1)</script>”提交带有脚本标签的请求,检查是否存在XSS漏洞.

4.3 接口滥用

        没有对带有敏感信息的接口限制请求频率,会导致各种爆破和遍历,造成数据泄露,同时接口被滥用也会导致系统资源被消耗,引入其他安全问题;

        如短信验证码爆破、登录爆破、手机号遍历、身份证遍历等。

4.4 信息泄露

        通过抓包,检查所请求的接口返回的数据,看有没有包含可利用的字段

关键参数是否加密:比如登陆接口的用户名和密码是否加密 ;支付接口中,涉及用户的身份证号码、银行卡卡号、银行卡CVV码等之类的信息有无加密;

        如果有使用第三方接口,也要检测第三方接口是否会泄露用户信息;

        还有错误请求返回不包含敏感信息,如当用户登录失败的时候,不能明确指出是密码错误或者用户不存在,预防暴力撞破用户名或者密码.

4.5 HTTP 响应头控制

        发送 X-Content-Type-Options: nosniff 头.

        发送 X-Frame-Options: deny 头.

        发送 Content-Security-Policy: default-src 'none' 头.

        删除指纹头 - X-Powered-By, Server, X-AspNet-Version 等等.

        在响应中强制使用 content-type, 如果你的类型是 application/json 那么你的 content-type 就是 application/json.

        不要返回敏感的数据, 如 credentials, Passwords, security tokens.

在操作结束时返回恰当的状态码. (如 200 OK, 400 Bad Request, 401 Unauthorized, 405 Method Not Allowed 等等).

4.6 服务端配置漏洞

        如服务端版本信息泄露,或服务端程序本身存在漏洞等。

五、API 攻击方式

5.1 模糊测试

  使用自动化工具并行的将大量的随机内容(各种可能的值或可能的攻击向量)作为输入参数进行长时间的尝试,并自动验证响应信息,确认是否获取到意外收获(系统或代码相关的信息)。

5.2 注入攻击

  使用SQL,XML,Xpath,JSON,JavaScript等的常见攻击向量尝试进行代码注入,并验证意外响应。

5.3 无效/越界内容

  尝试各种无效或者超范围的内容,并验证响应信息。

5.4 恶意内容

  在上传功能点尝试上传可执行文件或脚本等,使服务器尝试进行解析。

5.5 XSS

  上传常见攻击向量进行XSS(反射型,存储型等)测试。

5.6 CSRF

  测试API是否含有token,token是否能复用,是否可被伪造。

5.7 不安全的直接对象引用

  尝试对顺序化的id号进行越权访问,尝试访问无权限的方法或操作。

5.8其它考虑

  1.   会话认证(token是否正确使用)
  2.   安全配置(前述攻击照成系统/应用等信息泄露)
  1. 常用接口安全测试类
  2. '''
  3. 1、sql注入
  4. (1)sql拼接:jdbc/obdc ----链接数据库
  5.    select * from userInfo where userId=1 ---查询id为1的用户
  6.    sql = sql + condition
  7. (2)使用第三方组件,比如java里面的hibernate,ibatis,jpa
  8.     通过各种sql查询业务信息,甚至破坏系统表
  9. (3)sql注入注意事项:
  10.     1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。
  11.     2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
  12.     3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
  13.     4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
  14.     5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
  15. 2、xss攻击
  16.     (1)描述:利用XSS的攻击者进行攻击时会向页面插入恶意Script代码,当用户浏览该页面时,嵌入在页面里的Script代码会被执行,从而达到攻击用户的目的。同样会造成用户的认证信息被获取,仿冒用户登录,造成用户信息泄露等危害
  17.     (2)安全风险:文字中可以输入js脚本,例如<script src=‘wrong URL’></script>这种有安全性的脚本,其它用户进入后可以获取该用户的cookie信息,即可以对该用户资源进行操作
  18. 3、越权访问
  19.     (1)描述:在一个产品中,一个正常的用户A通常只能够编辑自己的信息,别人的信息无法查看或者只能查看的权限,但是由于程序不校验用户的身份,A用户更改自己的id值就进入了B用户的主页,可以查看、修改B用户的信息,这种漏洞我们就将其称之为越权漏洞
  20.     (2)举例:用户登录app成功,系统记录用户id,例如userid为1。
  21.         安全风险:此时用户通过工具发送消息将userid设置为2后可能登陆成功,及用户可以通过修改userid来访问其它用户资源,引发严重问题。
  22. 4、csrf 请求伪造
  23.     (1)描述:CSRF是一种对网站的恶意利用,过伪装来自受信任用户的请求来利用受信任的网站。
  24.     (2)举例:在APP上打开某个网站时,突然弹出您已经中奖的提示和链接
  25.         安全风险:点开链接后会跳转到对应异常界面,并且用户本地信息可能已经被获取,如果在跳出界面进行相关操作,比如银行相关操作会引起更大的安全问题和严重损失。
  26.     (3)安全防护
  27. 1. 使用post,不使用get修改信息
  28. 2. 验证码,所有表单的提交建议需要验证码
  29. 3. 在表单中预先植入一些加密信息,验证请求是此表单发送
  30. '''

参考文章:

/developer/article/1491385

/p/7584cc21eb88

/p/8591a8efef47

/p/50ed46c80b1c

/emily-qin/p/

/qq_38942551/article/details/103734668

About Me:小麦粒

● 本文作者:小麦粒,专注于python、数据分析、数据挖掘、机器学习相关技术,也注重技术的运用

● 作者博客地址:/u010986753

● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

● 微信:pythonbao 联系我加微信群

● QQ:87605025

● QQ交流群py_data :483766429

● 公众号:python宝 或 DB宝

● 提供OCP、OCM和高可用最实用的技能培训

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

欢迎赞赏哦!有您的支持,小麦粒一定会越来越好!