基于原生sql如何在node中预防sql注入攻击?

993 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情

前情提要

随着互联网的反正,web网络安全日益受到人们的重视,如果稍不注意就会被有心之人有机可成,轻则损失无关痛痒的数据,重则损失上万,千万,亿的数据。前两篇文章讲到了如何在nodejs中也就是koa2框架中,使用mysql包mysql2包封装原生sql查询的方法。那么因为是原生sql,那么必然是缺少防御sql注入攻击的方法。今天这篇文章算是对那两篇文章的一个补充,补充一下,如何增强写的接口对sql注入攻击的防御能力。

首先我们要先了解什么是sql注入攻击

所谓的sql注入攻击,主要就是把sql语句注入到表单中或者页面请求的查询接口中,通过sql注释等相关方法欺骗服务器执行未验证的语句,然后返回数据。进而实现sql注入攻击。

通过加入sql注释来实现sql注入攻击

咱们通过一个示例来做个简单的演示:

  • 加入注释字符式sql注入攻击
    • 第一种:#
      • 这是我自己写的一个项目,我简单的改写了下。

        WX20220430-171520@2x.png

      • 然后发起请求

        WX20220430-171123@2x.png

      • 然后看到结果请求成功

        WX20220430-171230@2x.png

      • 从结果中就可以看到请求时携带的密码和数据库中的密码并不相同。但还是成功请求到数据,说明我们的字符串式sql注入攻击成功了。

    • 第二种: --
      • 其他操作都一样,只不过把 # 换成 --。记得--后面加个空格

      • 看结果:

        WX20220430-172438@2x.png

      • 还是成功了。

  • 通过id获取详情
    • 这是sql查询相关的代码

      WX20220430-173653@2x.png

    • 然后发起请求

      WX20220430-173443@2x.png

    • 然后成功

      WX20220430-173533@2x.png

    • 没错,它返回了所有的详情信息。

    • 可怕!!!

  • 诸如此类注入攻击还有很多,那我们该如何防御呢?

防御方法

  • 通过mysql的escape方法对接口传过来的值进行转译,防止存在恶意字符。
    • 注释式字符注入:
      • 首先在封装mysql的文件里导出query方法的同时再导出mysql.escape方法

        WX20220430-174616@2x.png

      • 然后我们再修改下接口文件

        WX20220430-174500@2x.png

      • 发起请求看结果:

        WX20220430-174527@2x.png

      • 从结果中可以看到此时通过注入注释式字符的sql注入攻击已经无效了。

    • 获取详情,通过修改id
      • 修改对id的处理

        WX20220430-175306@2x.png

      • 发起请求看结果

        WX20220430-175216@2x.png

      • 通过请求结果看到sql注入攻击失败,通过转译后我们的正常请求并没有受到影响。

  • 写sql语句时,使用占位符,让mysql去对数据进行合法化转译处理。
    • 我们通过登录接口作为示例看一下结果:

      WX20220430-175911@2x.png

      WX20220430-175821@2x.png

      WX20220430-175926@2x.png

      WX20220430-175847@2x.png

    • 从结果中我们看到通过占位符的方式抵御sql注入攻击成功,正常请求未受影响

  • 针对于登录而言,改变校验顺序也可以抵御攻击。比如先根据account查出用户信息,然后根据查出来的信息校验传过来的密码是否相等,相等就正确,不相等就不正确。
  • 如果还有其他方法还请各位XDM不要吝啬,在评论区里打出来,让大家一起学习下

总结

  • 在使用原生sql时,通过占位符和mysql包提供的escape方法可以有效的抵御sql注入攻击,同时,对于部分接口改变校验逻辑也可以实现抵御sql注入攻击。
  • 对于如何使用原生sql时使用占位符的方式,可以参考之前的两篇文章:基于mysql包的封装基于mysql2包的封装