第五章:nodejs koa2 mysql redis 全栈开发--安全(sql注入,xss攻击)

一、什么是sql注入:

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。是最原始、最简单的攻击,从有了web2.0就有了sql注入攻击。

这里举一个简单的典型例子:

我们知道,用户登录的时候我们要去查询用户表(users),对比用户名(username)和密码(password)

SQL语句:

// 正常
select * from users WHERE username="zhangsan" and password="524ab85686df0e52ada43b11b53cce35"

// sql注入 用户名写入:zhangsan'-- 
select * from users WHERE username='zhangsan'-- ' and password='524ab85686df0e52ada43b11b53cce35'

上面两条sql语句都能查询到用户的存在,并且第二条语句中密码校验的语句已经被注销了,那么这个时候如果别人知道你的用户名就能登录你的账号,这样子岂不是很危险??????

我们来执行一下前面的login API:(密码随便输入一个)

AAAAAAAAAAAAAAAAAAAAA,竟然真的可以登录~~~~~~~~,慌慌慌慌慌慌慌慌慌慌慌慌,怎么办怎么办~~~~~

我们来看下执行的sql语句,果然是 -- 后面被注释了~~~

select id, username, realname from users where username='zhangsan '-- ' and password='69d6b0c4c032f5c0673ca2471145c596'

不必慌,我们来看一下之前的db/mysql.js文件,

const mysql = require('mysql')
const { MYSQL_CONF } = require('../conf/db')

// 创建链接对象
const con = mysql.createConnection(MYSQL_CONF)

// 开始链接
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
}

module.exports = {
    exec,
    escape: mysql.escape // 防止sql注入 编码特殊字符
}

看到这段关键代码了吗???

escape: mysql.escape // 防止sql注入 编码特殊字符

我们来改动一下之前的controller/users.js  login方法:

const { exec, escape } = require('../db/mysql')
const { genPassword } = require('../utils/cryp')

const register = async (username, password) => {
    ...
}
const userNameFilter = async (username) => {
    ...
}

const login = async (username, password) => {
    username = escape(username) // 格式化 预防sql注入
    password = genPassword(password) // 生成加密密码
    password = escape(password) // 格式化 预防sql注入

    const sql = `
        select id, username, realname from users where username=${username} and password=${password}
    `
    // console.log('sql is', sql)

    const rows = await exec(sql)
    return rows[0] || ''
}

const userInfo = async (id) => {
    ...
}

module.exports = {
    login,
    register,
    userNameFilter,
    userInfo
}

我们再来试下:

果然登录失败了~~~啧啧啧!!!

格式化之后执行的sql语句:

select id, username, realname from users where username='zhangsan \'-- ' and password='69d6b0c4c032f5c0673ca2471145c596'

重要五颗星:

从上面对比我们可以知道,escape 就是对一下能对sql语句有影响的特殊字符进行格式化,预防拼接sql语句。

所以为了预防万一,我们需要把能拼接成sql语句的变量都要加上escape!

 

二、什么是xss攻击

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

攻击方式

常用的XSS攻击手段和目的有:

1、盗用cookie,获取敏感信息。

2、利用植入Flash,通过crossdomain权限设置进一步获取更高权限;或者利用Java等得到类似的操作。

3、利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。

4、利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。

5、在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDoS攻击的效果。

xss攻击就不一一叙述了,想了解的话,多查查资料即可。

下面来说nodejs怎么来防范XSS攻击:

首页我们安装一个xss依赖

npm install xss --save-dev

下来我们来举一个简单的例子吧!看注释!!

const xss = require('xss') // 引入xss
const { exec } = require('../db/mysql')

const getList = async (author, keyword) => {
    ...
}

const getDetail = async (id) => {
    ...
}

const newBlog = async (blogData = {}) => {
    // blogData 是一个博客对象,包含 title content author 属性
    const title = xss(blogData.title) // 防范xss攻击
    const content = xss(blogData.content) // 防范xss攻击
    const author = blogData.author
    const createTime = Date.now()

    const sql = `
        insert into blogs (title, content, createtime, author)
        values ('${title}', '${content}', ${createTime}, '${author}');
    `

    const insertData = await exec(sql)
    return {
        id: insertData.insertId
    }
}


module.exports = {
    getList,
    getDetail,
    newBlog
}

简明扼要的说一下:防范xss攻击的方式就是把特殊字符编码

什么是特殊字符呢?

用户输入的数据进行HTML Entity编码, 也就是对<script><a>等标签的< >进行转换,然后再保存到后台数据库。

例如:

在 input 输入框 恶意输入 <script> document.cookie </script>, 就会被转换为下面的语句并存入数据库:

&lt;script&gt; document.cookie &lt;/script&gt;,已达到无法执行 <script> 的目的!!!!

 

总结:

sql注入:窃取数据库内容

XSS攻击:窃取前端的cookie等敏感信息

密码加密:保障用户信息安全(重要)

DDOS攻击:需要硬件和服务来支持(需要OP支持)

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的移动操作系统,主要应用于移动设备,如智能手机和平板电脑。该系统最初由安迪·鲁宾开发,后被Google公司收购并注资,随后与多家硬件制造商、软件开发商及电信营运商共同研发改良。 Android操作系统的特点包括: 开放源代码:Android系统采用开放源代码模式,允许开发者自由访问、修改和定制操作系统,这促进了技术的创新和发展,使得Android系统具有高度的灵活性和可定制性。 多任务处理:Android允许用户同时运行多个应用程序,并且可以轻松地在不同应用程序之间切换,提高了效率和便利性。 丰富的应用生态系统:Android系统拥有庞大的应用程序生态系统,用户可以从Google Play商店或其他第三方应用市场下载和安装各种各样的应用程序,满足各种需求。 可定制性:Android操作系统可以根据用户的个人喜好进行定制,用户可以更改主题、小部件和图标等,以使其界面更符合个人风格和偏好。 多种设备支持:Android操作系统可以运行在多种不同类型的设备上,包括手机、平板电脑、智能电视、汽车导航系统等。 此外,Android系统还有一些常见的问题,如应用崩溃、电池耗电过快、Wi-Fi连接问题、存储空间不足、更新问题等。针对这些问题,用户可以尝试一些基本的解决方法,如清除应用缓存和数据、降低屏幕亮度、关闭没有使用的连接和传感器、限制后台运行的应用、删除不需要的文件和应用等。 随着Android系统的不断发展,其功能和性能也在不断提升。例如,最新的Android版本引入了更多的安全性和隐私保护功能,以及更流畅的用户界面和更强大的性能。此外,Android系统也在不断探索新的应用场景,如智能家居、虚拟现实、人工智能等领域。 总之,Android系统是一种功能强大、灵活可定制、拥有丰富应用生态系统的移动操作系统,在全球范围内拥有广泛的用户基础。
要使用koa2创建连接池mysql2,首先需要安装相应的依赖包。可以使用以下命令安装koa2和mysql2: ``` npm install koa@2 mysql2 ``` 接下来,你需要在你的代码中引入所需的模块和配置连接池。以下是一个简单示例: ```javascript const Koa = require('koa'); const mysql = require('mysql2/promise'); const app = new Koa(); // 创建连接池 const pool = mysql.createPool({ host: 'localhost', // 数据库主机名 user: 'root', // 数据库用户名 password: 'password', // 数据库密码 database: 'mydatabase', // 数据库名称 connectionLimit: 10, // 连接池大小限制 }); // 在中间件中使用连接池 app.use(async (ctx, next) => { try { // 从连接池获取连接 const connection = await pool.getConnection(); // 执行查询等操作 const [rows, fields] = await connection.execute('SELECT * FROM mytable'); // 释放连接 connection.release(); // 将查询结果传递给下一个中间件或响应给客户端 ctx.body = rows; } catch (err) { // 错误处理 console.error(err); ctx.status = 500; ctx.body = 'Internal Server Error'; } }); // 启动服务器 app.listen(3000, () => { console.log('Server is running on port 3000'); }); ``` 在上面的示例中,我们使用`mysql2/promise`模块来创建连接池,并在每个请求的中间件中使用连接池来执行数据库操作。请根据你的实际情况修改数据库的连接信息和查询语句。 这只是一个简单的示例,你可以根据自己的需求进行更复杂的操作和优化。希望能帮到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值