请求的唯一性(不可复制) 二)为了保证数据在通信时的安全性,我们可以采用参数签名的方式来进行相关验证 案例: 我们通过给某 [移动端(app)] 写 [后台接口(api)] 的案例进行分析: ...客户端: 以下简称app 后台接口:以下简称api 我们通过app查询产品列表这个操作来进行分析: app中点击查询按钮==》调用api进行查询==》返回查询结果==>显示在app中 一、不进行验证的方式...即得到签名Sign 新api接口代码: app调用:http://api.chinasoft.com/getproducts?...,就是对应请求只能使用一次,这样就算别人拿走了请求的完整链接也是无效的 唯一性的实现:在如上的请求参数中,我们加入时间戳 timestamp(yyyyMMddHHmmss),同样,时间戳作为请求参数之一...这样就算被人拿走完整的请求链接也是无效的。
这样在子版本变化过程中url的稳定的。变化有时是不可避免的,关键是如何管理变化。完整的文档和合理的时间表都会使得API使用者使用的更加轻松。...如果是这样的话你还有另外一个问题:你的http请求中的media类型是应该和accept 头同步还是和url?...只在需要的时候使用“envelope” 很多API象下面这样返回结果: { "data" : { "id" : 123, "name" : "John" } } 理由很简单:这样做可以很容易扩展返回结果...为了如此,我们可以在url中添加参数:embed(或者expend)。...API的错误码可以分为两部分,400系列和500系列,400系列表明客户端错误:如错误的请求格式等。500系列表示服务器错误。API应该至少将所有的400系列的错误以json形式返回。
文档中应该有关于何时弃用某个API的时间表以及详情。使用邮件列表或者博客记录是好方法。 版本化 在API上加入版本信息可以有效的防止用户访问已经更新了的API,同时也能让不同主要版本之间平稳过渡。...这样在子版本变化过程中url的稳定的。变化有时是不可避免的,关键是如何管理变化。完整的文档和合理的时间表都会使得API使用者使用的更加轻松。..."John" } } 理由很简单:这样做可以很容易扩展返回结果,你可以加入一些分页信息,一些数据的元信息等-这对于那些不容易访问到返回头的API使用者来说确实有用,但是随着“标准”的发展(...cors和http://tools.ietf.org/html/rfc5988#page-6都开始被加入到标准中了),我个人推荐不要那么做。...为了如此,我们可以在url中添加参数:embed(或者expend)。
我认为API的使用者对于/search这种url也不会有太大意见的(毕竟他很容易理解)。只要注意在文档中写清楚就可以了。 永远使用SSL 毫无例外,永远都要使用SSL。...这样在子版本变化过程中url的稳定的。变化有时是不可避免的,关键是如何管理变化。完整的文档和合理的时间表都会使得API使用者使用的更加轻松。...只在需要的时候使用“envelope” 很多API象下面这样返回结果: { "data" : { "id" : 123, "name" : "John" } } 理由很简单:这样做可以很容易扩展返回结果...#page-6都开始被加入到标准中了),我个人推荐不要那么做。...为了如此,我们可以在url中添加参数:embed(或者expend)。
POST术语如此流行以至于开始侵扰通俗用语。即使是那些不知道互联网如何工作的人们也能“post”一些东西到朋友的Facebook墙上。 这里至少有四个半非常重要的HTTP动词需要你知道。...一个好的RESTful API只允许第三方调用者使用这四个半HTTP动词进行数据交互,并且在URL段里面不出现任何其他的动词。 一般来说,GET请求可以被浏览器缓存(通常也是这样的)。...我依然喜欢通过接收头来指示返回内容类型(这也是HTTP标准的一部分),并且我觉得这么做也比较适当一些。 超媒体API 超媒体API很可能就是RESTful API设计的将来。...如果一个URL曾经被缓存过,并且在随后的请求中返回404错误,那么客户端可以很简单的回退到根URL并重新发现内容。 在获取集合中的一个资源列表时会返回一个属性,这个属性包含了各个资源的完整URL。...文档 老实说,即使你不能百分之百的遵循指南中的条款,你的API也不是那么糟糕。但是,如果你不为API准备文档的话,没有人会知道怎么使用它,那它真的会成为一个糟糕的API。
我曾经和你一样,我以前也是这么干的。我也这么说过。要明智,在 API 中使用版本管理,是你能尽早做出的最佳决策。...那么,让我们来想象一下,有一位用户在自己的手机中发送了一封无效的电子邮件。它以某种方式被传送到 API,API 自然会出发一次确认和错误,并且响应 400(错误请求)。...与此同时,API 应当发出一种通用的错误响应模式,使客户端能够将任意或全部的信息显示给终端用户。所以,如果是这样的话,你很有可能会返回一个错误信息:“输入的电子邮件地址无效”。...如果你要返回一个项目的集合,可能你并不需要完全了解模式细节,以及它们之间的关系——每次都是如此。如果这样会加快进度,就这么办。但始终要努力与响应中返回的模型保持一致。...只要把 Treblle 添加到你的 API 中,你就可以得到自动生成的支持 OpenAPI 规范的文档。然后你会得到实时监控和记录,这样你就可以了解别人在做什么,从而更好地帮助他们。
“不是Gin不好,是Fuego让我第一次觉得:写API像在点外卖——选好菜,剩下的交给厨房。”一、GoWeb框架的“中年危机”你是不是也这样?...——Go的“智能API厨房”Fuego是一个基于泛型+net/http的现代GoWeb框架,目标就一个:让你只关心业务逻辑,其余的,我来。...✨三大核心优势:痛点传统方案Fuego方案JSON解析&错误处理手写json.Unmarshal+判空+返回400自动绑定+自动返回结构化错误请求验证引入go-playground/validator+...手动调用structtag直接生效,无效请求秒拒API文档写YAML用注释生成根本没文档自动生成OpenAPI,实时同步代码变更关键:所有这些,无需额外配置,开箱即用。...它不会取代net/http,但它会让你忘记“原来写API曾经这么累”。
这样,即使这个请求即使被截取了,也只能在60s内进行重放攻击。 随机数(nonce): 但是,即使设置了时间戳,攻击者还有60s的攻击时间呢!...因为正常情况下,在短时间内(比如60s)连续生成两个相同nonce的情况几乎为0 服务端“第一次”在接收到这个nonce的时候做下面行为: 去redis中查找是否有key为nonce:{ nonce}的数据...第二次调用,查询redis,如果key存在,则证明是重复提交,直接返回错误。 7.版本控制 一套成熟的API文档,一旦发布是不允许随意修改接口的。...为了不增加程序员的压力,推荐使用swagger2或其他接口管理工具,通过简单配置,就可以在开发中测试接口的连通性,上线后也可以生成离线文档用于管理API 11.生成签名sign的详细步骤 结合案例详细说明怎么生成签名...这样,即使Token被劫持,对方不知道appSecret和签名算法,就无法伪造请求和篡改参数,并且有了token后也能正确的获取到用户的状态 面试官:业务开发时,接口不能对外暴露怎么办?
https://github.com/frostming/tetos 在实现过程中,我翻阅了很多云 TTS 服务的接口文档,发现它们接口的设计大相径庭,有的是 RESTful,有的是伪 RESTful,...有的文档里甚至只让你用 SDK,没有 HTTP 接口说明。...我们先忽略 set_ak(), Singleton 这种从别的语言过来的在 Python 里毫无必要的写法,并且也忽略他在 except Exception 逻辑里返回正常响应的行为(我得咬着后槽牙才能忍...这也是为什么要一个如此奇怪的 api_info,因为这是签名需要用的请求的信息,只好单独传递。...,区别是在 super() 返回的对象上修改)不知对开始的问题你们心目中的方案是不是这样。
这样,即使这个请求即使被截取了,也只能在60s内进行重放攻击。随机数(nonce):但是,即使设置了时间戳,攻击者还有60s的攻击时间呢!...我们将每次请求的nonce参数存储到一个“集合”中,每次处理HTTP请求时,首先判断该请求的nonce参数是否在该“集合”中,如果存在则认为是非法请求。...第二次调用,查询redis,如果key存在,则证明是重复提交,直接返回错误。7.版本控制一套成熟的API文档,一旦发布是不允许随意修改接口的。...为了不增加程序员的压力,推荐使用swagger2或其他接口管理工具,通过简单配置,就可以在开发中测试接口的连通性,上线后也可以生成离线文档用于管理API11.生成签名sign的详细步骤结合案例详细说明怎么生成签名...这样,即使Token被劫持,对方不知道appSecret和签名算法,就无法伪造请求和篡改参数,并且有了token后也能正确的获取到用户的状态登陆和退出请求后续请求客户端: 与上面接口签名规则一样类似,把
这样做的目的是为了寻找更多的攻击面,特别是针对IDOR或访问控制类型漏洞时尤为有用。然而这种习惯却逐渐成了我挖掘奇怪漏洞过程中必不可少的操作,此处我就分享一些类似漏洞安全,希望能对大家起到借鉴作用。...漏洞1:奇怪的负载均衡错误配置漏洞($400) 这个漏洞以前我从没见过,当我在分析Burp被动扫描收集的HTTP响应消息邮箱地址时,我发现其中一个并不属于我的Gmail邮箱地址,于是,我就查找这个邮箱的具体归属...漏洞4:用户授权Authorization Header头信息泄露漏洞 同样的,在测试某个目标API应用时,当我在检查HTTP响应中我自己的注册用户名时,我发现它竟然包含在了其中一个JS脚本中,该脚本中还包含了我对访问该...之后,我发现即使把我账户相关的会话Cookie删除之后,发起该请求,一样还会返回我的用户名和授权Authorization Header头信息: 我根本想不到会如此,所以我又接着进行了以下测试: 1、如果更改其中的...有两种利用方式,一是即使loc参数无效,那么目标API服务端将会返回响应用户的授权头信息,利用这个点可以构造钓鱼链接,以无效的loc为参数,发送给受害者,诱惑其点击,那么就会把其授权Authorization
在我搜索中文文档的过程中,我看到网上有很多人对API的实现进行了分享,对我来说还是有点大帮助的。但内容比较少,仅限于两三个特别常用的API。...大家如果有机会对接jira API文档,到时候一定要首先确认jira的版本。 HTTPcode 在jira API文档中,http协议响应状态码有很多使用。...在我之前的工作经历中,很少注意到http响应状态码这个数据。...因为大多数情况都是成功的话,返回200,不成功的话也是返回200(通过业务状态码来区分不同原因), 只有在接口请求失败,或者说服务器故障的时候会处理一下400和500系列的响应状态码。...响应不统一 在之前文章一起吐槽接口文档中, 我吐槽了一下,接口文档最坑的就是响应不统一,没想到在对接Jira文档的时候就出现了特别多这样的实践机会。
这样一次请求,在15分钟之内是有效的,超过15分钟,API接口的网关服务会返回超过有效期的异常提示。 目前生成签名中的密钥有两种形式: 一种是双方约定一个固定值privateKey。...参数校验 我们需要对API接口做参数校验,比如:校验必填字段是否为空,校验字段类型,校验字段长度,校验枚举值等等。 这样做可以拦截一些无效的请求。...这样信息如果通过API接口直接保留到外网,是非常不安全的,很容易造成用户隐私数据泄露的问题。 这就需要对部分数据做数据脱敏了。 我们可以在返回的数据中,部分内容用星号代替。...这样即使数据被泄露了,也只泄露了一部分,不法分子拿到这份数据也没啥用。 14. 完整的接口文档 说实话,一份完整的API接口文档,在双方做接口对接时,可以减少很多沟通成本,让对方少走很多弯路。...接口文档中需要包含如下信息: 接口地址 请求方式,比如:post或get 请求参数和字段介绍 返回值和字段介绍 返回码和错误信息 加密或签名示例 完整的请求demo 额外的说明,比如:开通ip白名单。
摘要: 嘿,各位奋战在Web开发一线的小伙伴们,我是默语!在我们的日常工作中,与HTTP错误码打交道是家常便饭。...然而,这个过程中并非总是一帆风顺。网络抖动、服务器过载、应用BUG、配置错误等都可能导致各种问题的出现,并通过HTTP状态码的形式反馈给我们。...://your-api-endpoint/users # 期望服务器返回400 # 正确的JSON示例: curl -X POST -H "Content-Type: application/...加强输入校验: 在服务器端对所有客户端输入进行严格的校验(格式、类型、范围、长度等),并对校验失败的请求返回明确的400错误和具体的错误信息,方便客户端调试。...文档: 提供清晰、准确的API文档,说明请求格式、参数要求等。
即使管道如此强大,在公有的API中却不常见。例如,我梳理过Go的标准库,在145个包中有超过6000个公有的API。在这上千个API中,去重后,只有5个用到了管道。...在公有的API中使用管道时,如何折衷考虑和取舍,缺乏指导。“共有API”,我是指“任何实现者和使用者是不同的两个人的编程接口”。...不足的是,Go本身并没有从类型或函数签名角度提供方法指定默认行为。作为API的设计者,你必须在文档中写明行为,不然其行为就是不定的。...不幸的是,在标准库中没有很好的例子。标准库中唯一的API就是rpc.Client.Go,但它违背了我们的原则。文档上这么写: Go异步的调用这个函数。它会返回代表着调用的Call数据结构。...“使用这个API需要调用方分配一个管道,难道API就不能替我们做么,像下面这样?”
事实上,我们在第一次这样做的时候或许是靠谱的,但是当产品发生变更的时候,比如产品想把推荐列表换成热销榜,那么之前做的万能接口就已经不满足这个业务场景了,只能新开一个V2版本。...从HTTP到RPC——定义好一个接口 我认为一个设计良好的接口一定包含了明确的异常编码,以及这个异常编码在什么业务场景上出现,这个异常编码怎样在客户端得到合适的处理。...简单来说,这个协议是在一次HTTP请求中对RPC服务发起多次调用,在API网关做响应报文的整合,最后做返回。...如果在API网关上去不停地为接口做Façade,API网关的代码必然也是很难维护的。 为了解决这个问题,我们让客户端去定义Façade,API网关只负责组装。...降低接入门槛 提供在线API文档和接入SDK。 但是变化总是存在,我们该如何解放生产力呢? 扩大API的影响力,基于API信息生成敏捷开发工具;强类型约束的SDK,及时暴露违背“契约”的行为。
这样做直接体现出了Company和Employee之间的结构关系,而且也体现出了一个Company就是一个Employee的集合体。 需求2:我想获取某个公司的某个员工信息。...需求:“我想获取系统里所有用户的数量”。 妥协的做法:我们确实可以先通过 GET api/users来获取系统里所有的用户信息,然后再算出用户的数量,但是这样做也太浪费资源并且效率也太低了。...这部分的详细介绍请点击:官方文档。 自动HTTP 400响应。也就是Action方法传入的model含有验证错误的时候,自动触发HTTP 400响应。...想要返回数据结果,我们需要在Controller里面添加一个Action方法。我暂时把它的返回类型写为IActionResult(详细介绍请点击官方文档)。...我暂时只想把结果序列化为JSON格式并返回,这里我new了一个JsonResult(参考文档),它可以做这项工作。
发展史 1、很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应, 尤其是我不用记住是谁刚刚发了...Token 中的数据是明文保存的(虽然我会用Base64做下编码, 但那不是加密), 还是可以被别人看到的, 所以我不能在其中保存像密码这样的敏感信息。...Token 在Web领域基于Token的身份验证随处可见。在大多数使用Web API的互联网公司中,tokens 是多用户下处理认证的最佳方式。...当我们在程序中认证了信息并取得token之后,我们便能通过这个Token做许多的事情。...即使在客户端使用cookie存储token,cookie也仅仅是一个存储机制而不是用于认证。不将信息存储在Session中,让我们少了对session操作。
Mozilla Developer Network文档上关于HTTP概述是一个相当全面的参考资料,尽管如此,在REST API设计方面,以下是将HTTP应用于RESTful设计的简要说明: HTTP具有动词...在响应体中返回错误详情 当API服务器处理错误时,将错误详细信息包含在JSON主体中可以帮助使用者进行调试,这是是非常方便的,如果您还能说明哪些字段受到了错误的影响,那就更好了!...这是最差的语义,相反,应该返回一个能准确描述错误类型的有意义HTTP状态码。尽管如此,你可能还在想:“但我按照您推荐的方式,在响应体中发送了错误详细信息,那么问题出在哪里呢?” 让我给你讲个故事吧。...)相关 - 我以前总是遇到这种情况。...在Node中,Restify似乎也是一个很好的选择,尽管我还没有尝试过。我强烈建议您试一试这些框架,它们将帮助您构建美观、优雅且设计精良的REST API。
q=yapi-plugin-pl 关于平台的使用,可以参考官方文档,本篇文章针对使用Yapi做API测试时,期望对每条请求增加特定算法的签名参数(header或者body中),尤其是实时签名,提供了特别好的解决方案...Yapi对所有做测试时发出的请求,以及收到的返回结果,都对外暴露了一种用脚本(可以是一大长串代码块执行某种逻辑,最后把值赋给请求或者响应中的参数)来修改它们的方式: image.png script.../api/400/41661#NodeJS 而Yapi暴露的方式里是使用CryptoJS来做的,所以基本上只要掌握了CryptoJS如何使用即可达到目的 2、CryproJS在Yapi里如何引用 Yapi...的文档里给了一个这样的用法说明,但很显然对于腾讯云签名这件事来说,肯定不足够。.../document/api/400/41661#NodeJS image.png 对照官方nodejs算法,修改yapi中的算法方法 image.png image.png 下面的代码是方便大家copy