最近知识星球中有位小伙伴问了我一个问题 :如何保证接口的真香安全性 ?
根据我多年的工作经验,这篇文章从11个方面给大家介绍一下保证接口安全的接口一些小技巧,希望对你会有所帮助。安全
图片
保证接口安全的真香第一步,也是接口最重要的一步,需要对接口的安全请求参数做校验。
如果我们把接口请求参数的真香校验做好了,真的接口可以拦截大部分的香港云服务器无效请求 。
我们可以按如下步骤做校验 :
校验参数是安全否为空 ,有些接口中可能会包含多个参数 ,真香有些参数允许为空 ,接口有些参数不允许为空,安全我们需要对这些参数做校验,真香防止接口底层出现异常 。接口校验参数类型,安全比如:age是int类型的,用户传入了一个字符串:"123abc" ,这种情况参数不合法,需要被拦截。校验参数的源码下载长度 ,特别是对于新增或者修改数据接口 ,必须要做参数长度的校验,否则超长了数据库会报异常。比如 :数据库username字段长度是30 ,新用户注册时,输入了超过30个字符的名称,需要提示用户名称超长了。虽说前端会校验字段长度 ,但接口对参数长度的校验也必不可少 。校验枚举值,高防服务器有些接口参数是枚举 ,比如 :status ,数据库中设计的该字段只有1 、2、3三个值。如果用户传入了4,则需要提示用户参数错误 。校验数据范围,对于有些金额参数,需要校验数据范围,比如:单笔交易的money必须大于0 ,小于10000。我们可以自己写代码 ,云计算对每个接口的请求参数一一做校验 。
也可以使用一些第三方的校验框架。
比如:hiberate的Validator框架,它里面包含了@Null、@NotEmpty、@Size 、@Max 、@Min等注解 。
用它们校验数据非常方便。
当然有些日期字段和枚举字段 ,可能需要通过自定义注解的方式实现参数校验 。
可能有些小伙伴认为 ,建站模板对接口返回值统一封装是为了让代码更规范。
其实也是处于安全方面的考虑 。
假如有这样一种场景 :你写的某个接口底层的sql ,在某种条件下有语法问题。某个用户请求接口之后,在访问数据库时 ,直接报了sql语法错误,将数据库名、表名、字段名、相关sql语句都打印出来了。源码库
此时 ,如果你的接口将这些异常信息直接返回给外网的用户 ,有些黑客拿着这些信息,将参数做一些调整 ,拼接一些注入sql,可以对你的数据库发起攻击。
因此 ,非常有必要对接口的返回值做统一的封装 。
例如下面这样:
复制{ "code":0, "message":null, "data":[{ "id":123,"name":"abc"}] }1.2.3.4.5.该json返回值中定义了三个字段:
code:表示响应码 ,0-成功 ,1-参数为空,2-参数错误 ,3-签名错误 4-请求超时 5-服务器内部错误等。message:表示提示信息 ,如果请求成功,则返回空。如果请求失败 ,则返回我们专门在代码中处理过 ,让用户能看懂的错误信息 。data:表示具体的数据 ,返回的是一个json字段。对返回值这样封装之后,即使在接口的底层出现了数据库的异常,也不会直接提示用户 ,给用户提示的是服务器内部错误 。
对返回值统一封装的工作 ,没有必要在业务代码中做,完全可以在放到API网关。
业务系统在出现异常时,抛出业务异常的RuntimeException ,其中有个message字段定义异常信息 。
所有的API接口都必须经过API网关 ,API网关捕获该业务异常 ,然后转换成统一的异常结构返回 ,这样能统一返回值结构。
在用户自定义输入框,用户可以输入任意内容。
有些地方需要用html的格式显示用户输入的内容,比如文章详情页或者合同详情页,用户可以自定义文案和样式 。
这些地方如果我们不做处理 ,可能会遭受XSS(Cross Site Scripting)攻击,也就是跨站脚本攻击。
攻击者可以在输入的内容中,增加脚本 ,比如 :<script>alert("反射型 XSS 攻击")</script>