接口不校验参数,SQL报错直接返给前端,服务器路径全露出来差点被拖库

5年前 (2021-10-16)阅读1回复0
genmulu
genmulu
  • 管理员
  • 注册排名1
  • 经验值27950
  • 级别管理员
  • 主题5590
  • 回复0
楼主

刚学写接口那会,我图省事,根本不做参数校验,前端传什么我就拼到SQL里,结果有次半夜收到服务器告警,发现有人在扫我的登录接口,传各种奇怪的字符串。我把请求日志拉出来一看,那个人在username参数里传单引号、union select,我直接把SQL报错信息整个返给前端了——里面清清楚楚写着我数据库的表名、字段名,甚至连服务器网站根目录的绝对路径都露出来了。 当时我后背全是冷汗,这等于我家门钥匙直接挂在门外,人家照着我返回的报错信息,就能直接构造SQL注入语句,把整个数据库拖走。后来我赶紧翻日志,发现他已经试了二十多种注入语句,只是我当时用的mysqli扩展默认不支持多语句执行,他才没成功,再晚两天可能真的数据库就被人洗空了。 问题根源就是我写接口太懒,参数不做任何校验,数据库报错了,PHP默认把详细错误直接输出到响应里,前端拿到什么就展示什么。从那之后我写所有接口,第一步就是参数白名单校验:手机号必须是11位数字,用户名必须是字母数字下划线,登录密码长度不能少于6位,任何不符合格式的参数直接返回“参数错误”,根本不进数据库查询。然后把PHP的详细错误显示关了,所有错误信息写到服务器日志里,前端永远只拿到统一的友好提示,比如“用户名或密码错误”,哪怕真的出了SQL错误,也绝不把技术细节露给前端。 现在我写接口还有个习惯,统一返回格式:code是状态码,0是成功,其他是错误码;msg是给用户看的提示;data是返回的数据。不管是参数错了、服务器崩了、还是数据库挂了,前端拿到的都是统一结构,不会拿到一堆奇怪的报错。之前我图省事写的那些接口,啥错误直接往外吐,现在回头看,全是裸奔。 有次一个新手朋友让我看他写的接口,我直接把他接口地址发过去,传个单引号,果然把整个SQL报错全返回来了,他当时都傻了,说他从来没想过要关错误显示。真的,新手写接口最容易犯的错就是不校验参数、不隐藏错误,你觉得方便了,黑客顺着你的报错信息,五分钟就能把你整个数据库摸得一清二楚,这点安全意识真的不能少。

本站源码来源于网络收集修改或者交换,甚至可能并非原创,如遇未经考证信息需持审慎态度。若有疑问,可联系本站处理。

本文地址:https://www.genmulu.cn/genmulu/2011.html

0
回帖

接口不校验参数,SQL报错直接返给前端,服务器路径全露出来差点被拖库 期待您的回复!

取消
载入表情清单……
载入颜色清单……
插入网络图片

取消确定

图片上传中
编辑器信息
提示信息