瞭解sql注入、xss攻擊及解決

前言

  • 朋友說:據說你作了個網站
  • 我說:對啊,趕忙成爲個人用戶啦
  • 朋友說:好啊,你知道sql注入、xss攻擊嗎
  • 我說:不知道
  • 朋友明天跟我說,哇,管理員帳戶就是好,有好多權限,真香
  • 我說:你怎麼能登陸我管理員帳戶???
  • 朋友說:你都不知道sql注入、xss攻擊,那你確定沒作這些,我利用sql注入,知道管理員帳戶就能夠登陸進去啦
  • 嚇得我趕忙去作一下相關工做,還好朋友告知
  • 下面詳細瞭解sql注入、xss攻擊及解決


四個方面

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語句,果真是 -- 後面被註釋了~~~
    node

  • 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!

3. 什麼是xss攻擊

  • XSS攻擊一般指的是經過利用網頁開發時留下的漏洞,經過巧妙的方法注入惡意指令代碼到網頁,使用戶加載並執行攻擊者惡意製造的網頁程序。這些惡意網頁程序一般是JavaScript,但實際上也能夠包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻擊成功後,攻擊者可能獲得包括但不限於更高的權限(如執行一些操做)、私密網頁內容、會話和cookie等各類內容。
  • 攻擊方式:
  • 盜用cookie,獲取敏感信息。
  • 利用植入Flash,經過crossdomain權限設置進一步獲取更高權限;或者利用Java等獲得相似的操做。
  • 利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻擊)用戶的身份執行一些管理動做,或執行一些通常的如發微博、加好友、發私信等操做。
  • 利用可被攻擊的域受到其餘域信任的特色,以受信任來源的身份請求一些平時不容許的操做,如進行不當的投票活動。
  • 在訪問量極大的一些頁面上的XSS能夠攻擊一些小型網站,實現DDoS攻擊的效果。

4. 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注入:竊取數據庫內容mysql

XSS攻擊:竊取前端的cookie等敏感信息web

密碼加密:保障用戶信息安全(重要)redis

DDOS攻擊:須要硬件和服務來支持(須要OP支持)sql

原文地址

juejin.im/post/5ed653…
數據庫

參考

第五章:nodejs koa2 mysql redis 全棧開發--安全(sql注入,xss攻擊) :blog.csdn.net/u012878818/…npm

相關文章
相關標籤/搜索