了解sql注入、xss攻击

一、sql注入

1. 什么是sql注入

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

2. sql注入例子

  • 用户登录,我们需要去查询用户表(users),对比用户名(username)和密码(password)
  • SQL语句:
  • // 正常
    select * from users WHERE username="zhangsan" and password="524abb53cce35"
     
    // sql注入 用户名写入:zhangsan'-- 
    select * from users WHERE username='zhangsan'-- ' and password='5245'复制代码

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

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

  • select id, username, realname from users where username='zhangsan '-- ' and password='696'复制代码

  • 不必慌,我们来看一下之前的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='6996'复制代码
  • 从上面对比我们可以知道,escape 就是对一下能对sql语句有影响的特殊字符进行格式化,预防拼接sql语句。
  • 所以为了预防万一,我们需要把能拼接成sql语句的变量都要加上escape!

二、xss攻击

1. 什么是xss攻击

  • XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容
  • 攻击方式:
  • 盗用cookie,获取敏感信息。
  • 利用植入Flash,通过crossdomain权限设置进一步获取更高权限;或者利用Java等得到类似的操作。
  • 利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。
  • 利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。
  • 在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDoS攻击的效果。

2. nodejs怎么来防范XSS攻击:

  • 首页我们安装一个xss依赖
  • npm install xss --save-dev复制代码

  • 下来我们来举一个简单的例子吧!看注释!!
  • const xss = require('xss') // 引入xss
    const { exec } = require('../db/mysql')
     
     
    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支持)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL注入XSS(跨站脚本攻击)和CSRF(跨站请求伪造)是三种常见的网络安全威胁,它们针对的应用场景和攻击机制有所不同。 1. SQL注入: - **定义**:攻击者通过在输入字段中插入恶意SQL代码,欺骗应用程序执行非授权的数据库查询,可能获取敏感信息或修改数据。 - **目标**:主要影响Web应用程序后端数据库,试图访问或操控存储在服务器的数据。 - **示例**:尝试在登录表单中输入"\' OR '1'='1",可能导致所有用户登录。 2. XSS攻击: - **定义**:攻击者在网站上植入恶意脚本,当用户访问含有这些脚本的页面时,脚本会在用户的浏览器上执行,可能窃取用户信息或控制用户的会话。 - **目标**:影响用户浏览器,操纵前端显示内容,或利用用户的行为进行攻击。 - **示例**:在网页中添加未过滤的用户评论,评论中包含HTML代码,如`<img src="malicious.com">`,可能导致恶意图片加载或跟踪。 3. CSRF攻击: - **定义**:攻击者通过伪装成合法用户,利用受害者已经登录的身份,发送请求到受信任的网站执行未经授权的操作,如转账、修改设置等。 - **目标**:利用用户的已认证状态,进行无需用户干预的恶意操作。 - **示例**:网站提供一个“一键购买”功能,如果一个恶意网站包含一个隐藏的表单,填充了受害者账户信息并指向该功能,用户无意点击后可能会完成购买。 相关问题: 1. 如何防止SQL注入攻击? 2. XSS攻击通常如何防御? 3. CSRF攻击如何通过令牌机制来防范?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值