一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情。
前情提要
随着互联网的反正,web网络安全日益受到人们的重视,如果稍不注意就会被有心之人有机可成,轻则损失无关痛痒的数据,重则损失上万,千万,亿的数据。前两篇文章讲到了如何在nodejs中也就是koa2框架中,使用mysql包和mysql2包封装原生sql查询的方法。那么因为是原生sql,那么必然是缺少防御sql注入攻击的方法。今天这篇文章算是对那两篇文章的一个补充,补充一下,如何增强写的接口对sql注入攻击的防御能力。
首先我们要先了解什么是sql注入攻击
所谓的sql注入攻击,主要就是把sql语句注入到表单中或者页面请求的查询接口中,通过sql注释等相关方法欺骗服务器执行未验证的语句,然后返回数据。进而实现sql注入攻击。
通过加入sql注释来实现sql注入攻击
咱们通过一个示例来做个简单的演示:
- 加入注释字符式sql注入攻击
- 第一种:#
-
这是我自己写的一个项目,我简单的改写了下。
-
然后发起请求
-
然后看到结果请求成功
-
从结果中就可以看到请求时携带的密码和数据库中的密码并不相同。但还是成功请求到数据,说明我们的字符串式sql注入攻击成功了。
-
- 第二种: --
-
其他操作都一样,只不过把 # 换成 --。记得--后面加个空格
-
看结果:
-
还是成功了。
-
- 第一种:#
- 通过id获取详情
-
这是sql查询相关的代码
-
然后发起请求
-
然后成功
-
没错,它返回了所有的详情信息。
-
可怕!!!
-
- 诸如此类注入攻击还有很多,那我们该如何防御呢?
防御方法
- 通过mysql的escape方法对接口传过来的值进行转译,防止存在恶意字符。
- 注释式字符注入:
-
首先在封装mysql的文件里导出query方法的同时再导出mysql.escape方法
-
然后我们再修改下接口文件
-
发起请求看结果:
-
从结果中可以看到此时通过注入注释式字符的sql注入攻击已经无效了。
-
- 获取详情,通过修改id
-
修改对id的处理
-
发起请求看结果
-
通过请求结果看到sql注入攻击失败,通过转译后我们的正常请求并没有受到影响。
-
- 注释式字符注入:
- 写sql语句时,使用占位符,让mysql去对数据进行合法化转译处理。
-
我们通过登录接口作为示例看一下结果:
-
从结果中我们看到通过占位符的方式抵御sql注入攻击成功,正常请求未受影响
-
- 针对于登录而言,改变校验顺序也可以抵御攻击。比如先根据account查出用户信息,然后根据查出来的信息校验传过来的密码是否相等,相等就正确,不相等就不正确。
- 如果还有其他方法还请各位XDM不要吝啬,在评论区里打出来,让大家一起学习下
总结
- 在使用原生sql时,通过占位符和mysql包提供的escape方法可以有效的抵御sql注入攻击,同时,对于部分接口改变校验逻辑也可以实现抵御sql注入攻击。
- 对于如何使用原生sql时使用占位符的方式,可以参考之前的两篇文章:基于mysql包的封装和基于mysql2包的封装