• 技术文章 >web前端 >js教程

    一文讲解Node+mysql对SQL注入

    青灯夜游青灯夜游2022-11-14 20:10:37转载197

    大前端成长进阶课程:进入学习

    虽然现在不会直接使用 原生NodeJS 的方式开发后台,但了解一下 SQL注入 还是很有必要的。

    本文使用 NodeJS + MySQLSQL注入 进行讲解。

    SQL注入攻击 是很古老的攻击方式了,自从 web2.0 诞生后就有 SQL注入攻击。它通常出现在 输入框文本域 等前端组件中。在输入的内容里加入 SQL语句 ,并一同传给后台。【相关教程推荐:nodejs视频教程

    后台一不小心就会将前端传过来的 SQL语句 拼接到自己的 SQL语句 中,最终拼接成一段攻击代码。

    所以必须加以预防,不然有可能出现数据泄露,甚至被删库等可能。

    SQL 注入演示

    以登录为例,我在 MySQL 中添加一个 users 表,里面存储用户名和密码。

    users 表中,我创建了一条数据:insert into users (username, password, realname) values ('leihou', '123', '雷猴');

    数据的意思是:

    此时,在 NodeJS 后台,我创建了一个登录方法

    const mysql = require('mysql')
    
    // 创建连接对象
    const con = mysql.createConnection({
        host: 'localhost', // 地址
        user: 'root', // 连接数据库的用户
        password: '123456', // 连接数据库的密码
        port: '3306', // 默认端口
        database: 'testdb' // 数据库名
    })
    
    // 开始连接
    con.connect()
    
    // 统一执行 sql 的函数
    function exec(sql) {
      const promise = new Promise((resolve, reject) => {
        con.query(sql, (err, result) => {
          if (err) {
            reject(err)
            return
          }
          resolve(result)
        })
      })
      return promise
    }
    
    // 登录方法
    const login = (username, password) => {
      const sql = `
        select username, realname from users where username='${username}' and password='${password}';
      `
    
      console.log(sql)
      return exec(sql).then(rows => {
        return rows[0] || {}
      })
    }

    上面是登录方法。

    最后可以通过 《NodeJS http请求》 里提到的方法创建一个接口给前端。由于接口部分不是本文重点,所以这里打算略过(让我偷懒吧)。

    此时再创建一个 HTML 页面,大概生成一下内容,然后使用 Ajax 与后端对接。

    如果你懒的话可以直接使用 postman 测试

    01.png

    根据上面的 登录方法 可以得知,前端输入以下内容就可以登录成功

    但如果此时,用户名输入的是 leihou' -- ,注意 -- 前后都有空格。那密码就可以随便输入了。

    最后拼接出来的 SQL 语句是 select username, realname from users where username='leihou' -- ' and password='aslkfjsaf';

    注意,密码我是随便输入的。

    MySQL 里, -- 代表注释的意思。所以上面的语句就变成 查询 username 为 leihou 的那条数据 。自然就绕过了密码。

    上面输入的 username 的内容绕过登录,泄露了信息。但如果别人要删掉你的表,那后果就非常严重了。

    比如在用户名输入框内输入:leihou'; delete from users; --

    直接就把 users 表给删掉了。

    防止方法

    SQL注入攻击 实在太古老了,有十几年历史了。所以基本的应对方法都成熟了。

    比如将前端传过来的字符串进行转码。

    使用 NodeJS 下载的 MySQL 依赖包里就提供了这个方法:escape

    // 省略部分代码
    const mysql = require('mysql')
    
    // 省略创建连接对象
    // 省略开始连接
    // 统一执行 sql 的函数 exec 方法
    
    const escape = mysql.escape
    
    const login = (username, password) => {
      username = escape(username)
      password = escape(password)
      const sql = `
        select username, realname from users where username=${username} and password=${password};
      `
    
      console.log(sql)
      return exec(sql).then(rows => {
        return rows[0] || {}
      })
    }

    使用 escape 方法过滤后的字符串会被转义。

    此时如果用户名输入 leihou' -- ,在后端控制台会打印出如下内容:

    select username, realname from users where username='leihou\' -- ' and password='123345';

    可以看到 leihou' 后面的单引号被转义了。

    以上就是 MySQL 防范 SQL注入攻击 的方法。

    更多node相关知识,请访问:nodejs 教程

    以上就是一文讲解Node+mysql对SQL注入的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除

    千万级数据并发解决方案(理论+实战):点击学习

    Mysql单表千万级数据量的查询优化与性能分析

    Mysql主从原理及其在高并发系统中的应用

    专题推荐:Node.js 后端
    上一篇:浅析React Hook中useEffecfa函数的使用 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• node 413错误怎么解决• node.js 输出中文乱码怎么办• node与gulp不兼容怎么办• 聊聊Node中的异步实现与事件驱动• node中怎么获取命令行中的参数• 浅析Nodejs中的http模块和导出共享
    1/1

    PHP中文网