主动识别API漏洞-API安全测试 (主动识别安全隐患,全年未)

教程大全 2025-07-11 20:38:53 浏览

20多年的开发部署后,API已经到处都是。2021年的调查研究中,73%的企业表示自己已经发布了超过50个API,且这一数字还在不断增长。

API在当今几乎每个行业里都起着举足轻重的作用,而且随着它们逐渐迈向业务战略前沿,其重要性还在平稳上升。出现这种现象其实毫不意外:API无缝连接不同应用和设备,带来前所未有的业务协同效应和效率。

但是,与软件任何其他组件一样,API也免不了存在漏洞。基于此,如果没有经过间隔的安全测试,API也有可能引入全新的攻击途径,将用户暴露在前所未有的风险之下。坐等生产部门发现API漏洞是不现实的,你只会等来严重延迟。

API不仅受广大企业青睐,也是攻击者眼中的香饽饽

API可不仅仅是简单连接企业各种应用,它们还会以无法预测的方式改变功能。API可能引入的很多独特缺陷都广为黑客所知,他们开发出不同方法攻击API,从而访问底层数据和功能。

开放Web应用安全项目(OWASP)的API Top 10表明,通过身份验证的合法用户利用API漏洞的情况并不鲜见,此类用户利用看似合法的调用,实际上却意图篡改API。这种攻击旨在篡改业务逻辑并利用设计缺陷,对攻击者极具吸引力。

每个API都是独特且专有的。因此,其软件漏洞也是独特且“未知”的。防御者很难发现这类可导致业务逻辑或业务过程级攻击的漏洞。

图1:业务逻辑漏洞和传统漏洞

是否给予了API安全测试足够的重视?

左移安全已广为多数企业接受,整个开发过程贯穿持续测试的做法已成常规。然而,API安全测试常被漏掉,或者执行时缺乏对所涉风险的重复理解。为什么会这样?原因不止一个:

因此,尽管左移安全已普遍受到大多数企业重视,但API安全测试却常被排除在DevSecOps蓝图之外。

这是个令人遗憾的状况,因为相比传统应用漏洞,API漏洞需要更长的响应时间:近期一项调查中,63%的受访者报告称需要更长时间来修复API漏洞。考虑到应用对API的依赖和快速采用情况,这一数字可能还会继续上升。

图2:相比传统应用漏洞,存在API漏洞情况下的平均修复时间

虽然大多数安全主管都意识到了API安全测试的重要性,但仍有近一半的安全主管称自己尚未将API安全测试解决方案完全集成进开发流水线中。

为什么常规安全测试方法无法覆盖API?

要实现全面的安全方法,第一步就是仔细考察当前对于应用安全测试的普遍态度:静态安全测试和动态安全测试。

静态安全测试采用白盒测试方法,基于应用的已知功能创建测试,审查应用的设计、架构或代码,包括数据在流经应用时可采取的诸多复杂路径。

动态安全测试采用黑盒测试方法,基于应用摄入特定输入集的的预期性能创建测试,不考虑内部处理或底层代码知识。

至于API,开发人员和安全团队常常争论这两种方法哪种最适用,各自的支持理由包括:

虽然有点扫兴,但以上两种观点都不完全正确。事实上,两种方法都需要确保广泛覆盖和处理一系列可能的场景。尤其是随着近期API攻击的兴起,防御者不能在可扩展性、深度和频率方面冒险。

图3:动态API安全测试与静态API安全测试

这种情况下,“灰盒”API安全测试成为了一个有趣的替代方案。因为没有用户界面,知道应用的内部运行机制(如参数、返回类型等)有助于高效创建针对业务逻辑的功能性测试。

理想状态下,综合考虑API安全测试的各个方面可以更好地创建灰盒解决方案,弥补单个方法的不足。此类业务逻辑方法可智能检查其他测试类型的结果,并自动或手动调整应用改进的测试。

业务逻辑API安全测试方法

业界越来越意识到API安全防护应贯穿整个API生命周期,将API置于安全控制的前端和中心。

为此,我们必须找到简化和弥合企业API安全测试的方法,将API安全测试标准融入开发周期并加以实施。这样一来,在运行时监测的帮助下,安全团队就能够在一个地方获得对所有已知漏洞的可见性。并且,左移API安全测试还可以削减成本并加速修复。

此外,如果能够自动化测试工作流,企业就内置了对重测试的支持:测试、修复、重测、部署的循环,保持流水线平稳运行,避免出现瓶颈。

采用业务逻辑方法执行API安全测试可以提高全生命周期API安全计划的成熟度,改善企业安全状态。

图4:生产到设计

然而,这种现代方法需要能自学习的工具,通过摄入运行时数据逐渐改进性能,从而深入了解应用的结构和逻辑。

API安全测试

这将涉及创建能够随运行过程不断学习的自适应测试引擎,积累关于API行为的深入认知,以便智能逆向工程其隐藏的内部工作机制。借助运行时数据和业务逻辑信息,企业能够享受黑盒和白盒两种方法带来的好处,实现可见性增强和自动化控制。

总结

除了逐渐普及,API也给Web应用带来了更多漏洞。许多企业甚至不清楚自身API应用范围和漏洞情况。黑客可以很容易地通过可用API探测已知和未知漏洞。

然而,企业常常忽视了API安全测试,像对待Web应用一样处理API安全测试。大多数测试方法,比如黑盒测试和白盒测试,并不适合API测试。

自然语言处理和人工智能(AI)的结合提供了可行“灰盒”选项,能够自动化、扩展和简化API安全测试的复杂过程。


当一个边后卫有什么需注意的地方

1、防守。 边后卫防守的主要职责是防守边翼,并根据球的位置和教练员所决定的防守战术去行动。 在战术上的任务是:(1) 严防边路通道。 防守对方的边锋或者进入边锋位置的其他队员,为此必须:⑴占据有利位置⑵识别对手特点(2) 封锁攻门通路,保护球门免遭对手的攻击是防守的核心、也是边后卫的重要任务。 为此必须:⑴防守同侧边锋(包括临时边锋)时可以采用“堵内放外”的原则,切断对手内切直达球门的通路。 ⑵当对手突破自己而中卫补位时,则应积极地进行交叉补位,弥补中路空隙。 ⑶对方在异侧边路进攻时,应该“放边保中”,随时弥补中卫防守上的漏洞和抢断对手长传转移球。 ⑷对方在中路进攻时,在人球兼顾的前提下,适当向中路收缩,随时准备弥补中卫防守上的漏洞。 (3) 参与制造越位。 一般情况下边后卫的位置不要落在自由中卫的后面。 需要运用造越位战术时,边后卫压出应快,切忌因落在后面而导致造“越位”战术的失败。 2、 进攻。 提高边后卫的进攻质量对于确保攻守平衡和增强全队的进攻力量具有重要意义,边后卫参加进攻的形式大体上有以下几种:(1) 迅速发动进攻。 当边后卫抢获球后,在可能情况下要利用中长传迅速将球传到对对方构成最大威胁的地域,发动有效的快速反击。 (2) 接守门员发球。 一旦守门员得球后,边后卫应该及时拉开,接应守门员发球,加快由守转攻的速度,迅速组织进攻。 (3) 参与中场的组织进攻。 边后卫在中场很容易与同伴进行配合,在侧翼接应传球后要象前卫一样也应组织进攻,以加强中声力量和优势。 (4) 担当临时边锋。 当前方边路地区出现明显空当时,应该及时插上,充当边锋角色实施带球突破、“二过一”、传中射门等。 边后卫插上进攻一要量力而行,二要掌握时机,三要失球时迅速回位。

谁能知道Java是什么

1966年,一门叫Simula的模拟语言备受人们青睐。 Simula是由Ole-Johan Dahl和Kristen Nygaard创建的,他们当时在奥斯陆的挪威国家计算机中心工作。 当时,Simula具有很多新的、有趣的特点。 例如,Simula可以把一组事件归入一个类别(classification),称之为“类”(class);也可以把某一类组成部分的子集归入另一个类别,称之为“子类”(subclass)。 Bjarne Stroustrup就是Simula的使用者之一。 20世纪70年代末,正在剑桥大学攻读博士学位的Stroustrup想在学位论文上有所突破。 除了这种语言在速度上非常慢之外,他对这种语言的其他方面都比较满意。 为了使模拟器运行得更快,他改写了Martin Richard的Basic Combined Programming Language(BCPL,基本组合程序设计语言)中的程序。 虽然要改变程序非常困难,但最后他还是通过了毕业论文答辩,并且在位于新泽西州Murray Hill的一家名为Bell Telephone Laboratories的电话公司实验室工作,也就是现在的美国朗讯公司。 20世纪70年代,贝尔实验室的一名工作人员Ken Thompson正致力于测试一门基于BCPL的新语言,称为B语言。 Ken Thompson想给B语言添加数据类型,于是在1971年他又发展了一门新的语言,称为C语言。 从那以后,C语言风靡全球。 以至于在1983年,美国国家标准化组织甚至考虑要把它作为该组织的一个标准(称为ANSI C)。 1979年5月,Stroustrup开始利用类(class)来开发一种称为C的项目。 他的目标是将C的速度和他所熟悉的Simula类结合在一起。 他当时还在贝尔实验室工作,并深知速度对于在那里工作的人来说是多么重要。 到了1983年,C++首次投入使用。 后来,C++越来越普及,并广泛应用在各个行业的许多公司里,其中包括位于加州Mountainview的一家名为Sun Microsystems的公司。 在1991年初,Sun公司的软件工程师就已经开始拓展嵌入式系统的市场。 这个被称为Project Green的项目,要求在各种消费者的电子设备中使用廉价的微处理器,这些消费者的电子设备包括个人数字助理(Personal Digital Assistant,PDA)、交互式电视盒以及家用电器。 Sun的另一个成员James Gosling开始扩展C++编译器。 20世纪90年代中期,又出现了一门叫做Oak的新语言。 后来,由于注册商标的问题,这一名称没有延续下来,而改为Java。 尽管Java是为嵌入式系统而设计的,但直到1994年,网络的使用才持续上升。 Java的出现正好适应了基于网络的应用。 尤其是Java具有多平台、简单、安全、强大的功能,而这些都是网络所需要的。 因此,Java的一些功能可以直接追溯到C++中的类(class),而类(class)又源于1966年出现的模拟语言Simula。 此外,Java也借鉴了C语言的一些功能。 实际上,如果详细研究Java语言,就会发现Java几乎没有什么可以称得上新颖的地方。 1.2 什么是Java人们已经习惯用Java这个术语来涵盖各种Java技术。 Java技术包括Java编程语言、支持类库以及Java虚拟机(Java Virtual Machine,JVM)。 Java技术利用Java模型实现了Java程序的运行。 典型的Java模型将利用若干层(也叫底层,substrate)。 Java程序被一个叫做Java虚拟机的底层从硬件中隔离出来。 图1.1显示了一个Java模型。 图1.1 Java模型Java盛行的原因很多。 首先,Java是一门多平台语言。 Java多平台功能的关键元素是peer方法,如图1.1所示。 peer方法提供了一个应用程序接口(Application Program Interface,API)。 该接口的目标就是提供一个从高级Java应用程序接口到初级操作系统子程序的映射。 peer方法提供了一种实现可移植操作系统接口的方法。 操作系统软件接口库提供了一个ANSI C、C++或FORTRAN都没有的编程环境。 这种环境为程序提供外观和运行方式。 例如,C++程序员在Windows下编程,编程环境就像是一个Windows编程环境。 也就是说,可能会调用Microsoft基础类。 如果在UNIX下编程,编程环境就像一个UNIX环境,即要调用X-Window库子程序。 Java的独特之处是它能够提供一个可移植的操作系统软件接口。 例如,不管使用哪种操作系统,用Java编写一个显示对话框的程序都是相同的。 但是,Java的可移植功能也会受到库的跨平台支持的限制。 在这种情况下,使用非可移植库的Java程序将不再是可移植的了。 例如,有人在Java内创建了到C库子程序的链接。 由于要使Java成为可移植的,其他平台上必须提供这些子程序。 把Java臆想成一门“编译一次,走遍天下”式的语言是错误的。 Java在每个平台上都需要测试,有时还需要调试。 因为在一个平台上运行良好的程序在另一个平台上却不能运行,这种情况很常见。 此外,Java以外的语言也可以利用Java技术。 例如,要实现一个非Java编译器来创建可在Java虚拟机(JVM)上运行的Java字节码是有可能的。 1.3 Java模型与HTML模型的比较我们已经知道Java是为嵌入式系统而设计的一门语言。 但是,Java过去并没有广泛用于嵌入式系统。 相反,人们认为可以用Java来补充甚至替代HTML模型。 本节将讲述HTML模型以及Java怎样替代HTML模型。 我们可以在Internet上找到很多文件。 数据结构保存在文件中并需要解码。 可被生成的不同数据文件的数量是不受限制的。 尽管文件格式的数量是可计算的,但通常谁都没有计算,并且该数字将以未知的速度增长。 用于计算不同文件格式数量的工具很少,而用来解码这些文件格式的工具就更少了。 图1.2讲述了数据分布的Web模型。 Web服务器通过超文本文件传输协议(Hyper Text Transfer Protocol,HTTP)把Web页面传给客户端。 浏览器使用包含特定格式代码的插件程序(plug-ins)来进行解码。 不同的文件格式要求用不同的插件程序或辅助程序来显示。 所以,插件程序扩展了浏览器的性能。 使用Java技术的浏览器通过动态下载的算法能够进行解码。 这一过程要求一种能够即时运行程序的方法。 为了明确安全性,Java给即时下载的程序设置了功能限制。 安全管理器(security manager)对即时下载的Java程序的功能进行了准确控制。 用Java模型代替HTML模型的基本前提是,程序可以在不同的平台上按要求运行。 但是,由于Java缺乏统一的支持,所以Java模型没能代替HTML模型。 当前的不利因素包括人们对Java技术及知识产权的争论。 图1.2 Internet1.4 小结与C或C++不同,当用Java编程的时候,编程环境感觉像Java。 另外,C++没有Java所具备的可移植应用编程接口(API)。 如果在Windows中用C++编程,编程环境就像Windows,因此必须学习Windows API。 同样,如果在Macintosh下用C++编程,编程环境就会有一种类似Maxintosh接口的外观和运行方式。 基于上述的讨论,有人认为客户端的Java是一成不变的,HTML模型的变革也不可能发生。 然而,仅在2001年3月到8月短短5个月的时间内,600多万部用Java开发的手机在日本被抢购一空。 无线供应商(NTT DoCoMo、J-Phone和KDDI)已提供了交互式服务。 有人预计,在2001年到2005年期间,有7亿多台Java虚拟机将要被配置到这些新设备上。 或许,这些具有JVM特性的新平台会使客户端Java能够长久地延续下去。

浏览器历史列表中的url数量是什么意思

URL编码及解码原理:由于我们利用URL传递参数这种方式是依赖与浏览器环境中的,也就是说URL及URL中包含的各个key=value格式的传递参数键值对参数是在浏览器地址栏中的处理原理处理相应编码后传递至后台进行解码的。 由于我们没有进行任何处理,此时javascript请求URL并传参数存在中文时(也就是说输入框中输入中文时),对URL的中文参数进行编码是按照浏览器机制进行编码的。 此时编码存在乱码问题。 假设输入框中输入的内容为“测试”二字,后台Action接受到的参数值为乱码。 javascript中利用encodeURI()方法进行编码。 1、利用encodeURI()在javascript中对中文URL参数进行编码时,“测试”二字会被转换为“%E6%B5%8B%E8%AF%95”2、但是浏览器机制会认为“%”是一个转义字符,浏览器会把地址栏URL中的传递的已转换参数“%”与“%”之间的已转义字符进行处理传递到后台Action中。 这样会造成与实际经过encodeURI()编码后的URL不符,因为浏览器误认为“%”是转义字符字符了,它并未将“%”认为是个普通字符。 3、要使得通过encodeURI()转换后的URL被浏览器正常处理,必须在外层再用encodeURI()处理一次已被encodeURI()编码后的RUL。 这此处理encodeURI()会将已编码后的URL中被浏览器解析为转义字符的“%”再次进行编码,转换为普通字符。 4、正常处理后,前面javascript代码中②处代码为 = encodeURI(encodeURI(sayHello?= + name));5、处理后的URL不在是通过一次 encodeURI()转换后的字符串”%E6%B5%8B%E8%AF%95“,而是经过上一步两层encodeURI()处理URL处理后的字符串”%25E6%B255%258B%25E8%AF%2595“,通过再次编码原有被浏览起解析为转义字符的”%“被再次编码,转换成了普通字符转”%25“。 此时前端javascript代码对带有中文的URL编码已经完成,并通过URL传递参数的方式传递到后台Action等待处理,Action获取到正常转换切无乱码的参数为”%25E6%B255%258B%25E8%AF%2595“,此字符串对应的中文正是我们输入的”测试“二字。 Action获取到这样的字符串无法进行处理,因为它并不是我们前端输入的源数据”测试“二字,而是进过两次encodeURI()编码后的字符串。 于是我们需要利用后台的一个API对前端编码后的参数字符串进行解码,对应解码API是((),UTF-8)。 URLDecoder的decode(String str,String ecn)方法有两个参数,第一个参数为待解码的字符串,第二个参数为解码时的对应编码。 我么在后台使用此API进行解码的代码为((),UTF-8);

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐