您的位置: 翼速应用 > 业内知识 > web前端 > 正文

总结分享:利用Node+mysql对SQL注入的详细解析

本文是关于sql注入的总结分享文,旨在帮助大家掌握sql注入的相关知识,利用Node+mysql进行一个详细解析,虽然现在不会直接使用 原生NodeJS 的方式开发后台,但了解一下 SQL注入 还是很有必要的,下面一起来看看吧。


总结分享:利用Node+mysql对SQL注入的详细解析


总结分享:利用Node+mysql对SQL注入的详细解析


SQL 注入演示


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


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


数据的含义:


●  username: 'leihou'


●  password: '123'


●  realname: '雷猴'


此时在 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 测试


但如果此时,用户名输入的是 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' 后面的单引号被转义了。


关于Node+mysql对SQL注入的详细解析到这里就结束了,翼速应用平台内有更多相关资讯,欢迎查阅!


我来说两句

0 条评论

推荐阅读

  • 响应式布局CSS媒体查询设备像素比介绍

    构建响应式网站布局最常见的是流体网格,灵活调整大小的站点布局技术,确保用户在使用的幕上获得完整的体验。响应式设计如何展示富媒体图像,可以通过以下几种方法。

    admin
  • 提升网站的性能快速加载的实用技巧

    网站速度很重要,快速加载的网站会带来更好的用户体验、更高的转化率、更多的参与度,而且在搜索引擎排名中也扮演重要角色,做SEO,网站硬件是起跑线,如果输在了起跑线,又怎么跟同行竞争。有许多方法可提升网站的性能,有一些技巧可以避免踩坑。

    admin
  • 织梦CMS TAG页找不到标签和实现彩色标签解决方法

    织梦cms是我们常见的网站程序系统的一款,在TAG标签中常常遇到的问题也很多。当我们点击 tags.php 页的某个标签的时候,有时会提示:“系统无此标签,可 能已经移除!” 但是我们检查程序后台,以及前台显示页面。这个标签确实存在,如果解决这个问题那?

    admin
  • HTML关于fieldset标签主要的作用

    在前端开发html页面中常用的标签很多,今天为大家带来的是关于HTML中fieldset标签主要的作用说明,根据技术分析HTML

    admin

精选专题