ノードJSのセキュリティと防止のためのSQLインジェクション、XSS攻撃、パスワード暗号化

1.セキュリティ

  1. セキュリティのために、次のように:
  • sql インジェクション:データベースコンテンツを盗む
  • XSS攻撃:cookieコンテンツの先端を盗む
  • パスワードの暗号化:ユーザー情報のセキュリティを確保するため
  • server エンドアタックには多くの方法があり、多くの防止方法があります。
  • nodejsすることでweb server予防のレベル
  • 一部の攻撃では、サポートするためにハードウェアとサービスが必要でありOP、次のようなサポートが必要です。DDOS

2、SQLインジェクション

  1. sql 次のように注入します。
  • 最も原始的で単純な攻撃は、web2.0そこからsql注入攻撃を受けました
  • 攻撃:sqlそのフラグメントを、最終的なスプライスされた攻撃コードのセクションに入力します
  • 注意事項:関数を使用MySQLescapeて入力コンテンツを処理します
  1. sqlnodeJS次のような注射アプリケーションプログラム:
  • db.js、コードは次のとおりです。
const env = process.env.NODE_ENV // 环境参数

// 配置
let MYSQL_CONF
let REDIS_CONF

if (env === 'dev') {
    
    
  // mysql
  MYSQL_CONF = {
    
    
    host: 'localhost',
    user: 'root',
    password: '123456',
    port: '3306',
    database: 'nodeblog'
  }

  // redis
  REDIS_CONF = {
    
    
    port: 6379,
    host: '127.0.0.1'
  }
}

if (env === 'product') {
    
    
  // mysql
  MYSQL_CONF = {
    
    
    host: 'localhost',
    user: 'root',
    password: '123456',
    port: '3306',
    database: 'nodeblog'
  }

  // redis
  REDIS_CONF = {
    
    
    port: 6379,
    host: '127.0.0.1'
  }
}

module.exports = {
    
    
  MYSQL_CONF,
  REDIS_CONF
}
  • mysql.js、コードは次のとおりです。
const mysql = require('mysql')
const {
    
     MYSQL_CONF } = require('../config/db')

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

// 开始连接
con.connect()

// 统一执行的 sql 的函数
function exec (sql) {
    
    
  // 返回 promise 对象
  const promise = new Promise((resolve, reject) => {
    
    
    con.query(sql, (err, result) => {
    
    
      if (err) {
    
    
        // console.error(err)
        reject(err)
        return
      }
      // console.log(result)
      resolve(result)
    })
  })

  return promise
  
}

module.exports = {
    
    
  exec,
  escape: mysql.escape
}
  • user.js、コードは次のとおりです。
const {
    
     exec, escape } = require('../db/mysql')

const login = (username, password) => {
    
    

  username = escape(username)
  password = escape(password)

  const sql = `select username, realname from users where username=${
      
      username} and password=${
      
      password};`
  
  return exec(sql).then(rows => {
    
    
    return rows[0] || {
    
    }
  })
}

module.exports = {
    
    
  login
}

3、XSS攻撃

  1. XSS 攻撃は次のとおりです。
  • 攻撃:ページにドーピングすると、js情報ページを取得するためのコンテンツコードが表示されます
  • 予防策:変換によりjs特殊文字が生成されます
  1. XSSnodeJSアプリケーションプロジェクト攻撃は次のとおりです。
  • npm i xss --saveコマンドダウンロードするxssモジュールを
  • ではblog.js、次のようなコード:
const xss = require('xss')
const title = xss(blogData.title)

  • 完了するblog.jsと、コードは次のようになります。
// controller 只关心数据
const {
    
     exec } = require('../db/mysql')
const xss = require('xss')

const getList = (author, keyword) => {
    
    
  // 先返回假数据,格式是正确的
  let sql = `select * from blogs where 1=1 `
  if (author) {
    
    
    sql += `and author='${
      
      author}' `
  }
  if (keyword) {
    
    
    sql += `and title like '%${
      
      keyword}%' `
  }
  sql += `order by createtime desc;`

  // 返回 promise
  return exec(sql)
}


const getDetail = (id) => {
    
    
  // 先返回的数据
  const sql = `select * from blogs where id='${
      
      id}'`
  return exec(sql).then(rows => {
    
    
    return rows[0]
  })
}


const newBlog = (blogData = {
    
    }) => {
    
    
  // blogData 是一个博客对象,包含 title、content 属性
  // console.log('newBlog blogData...', blogData)

  const title = xss(blogData.title)
  const content = xss(blogData.content)
  const author = blogData.author
  const createtime = Date.now()

  const sql = `insert into blogs (title, content, createtime, author)
              values ('${
      
      title}', '${
      
      content}', ${
      
      createtime}, '${
      
      author}');`
  
  return exec(sql).then(insertData => {
    
    
    console.log('insertData is ', insertData)
    return {
    
    
      id: insertData.insertId
    }
  })

}


const updateBlog = (id, blogData = {
    
    }) => {
    
    
  // id 就是要更新博客的 id
  // blogData 是一个博客对象,包含 title、content 属性
  
  const title = xss(blogData.title)
  const content = xss(blogData.content)

  const sql = `update blogs set title='${
      
      title}', content='${
      
      content}' where id=${
      
      id}`

  return exec(sql).then(updateData => {
    
    
    console.log('updateData is', updateData)
    if (updateData.affectedRows > 0) {
    
    
      return true
    }
    return false
  })
}


const deleteBlog = (id, author) => {
    
    
  // id 就是要更新博客的 id
  const sql = `delete from blogs where id=${
      
      id} and author='${
      
      author}';`

  return exec(sql).then(delData => {
    
    
    if (delData.affectedRows > 0) {
    
    
      return true
    }
    return false
  })
}


module.exports = {
    
    
  getList,
  getDetail,
  newBlog,
  updateBlog,
  deleteBlog
}

第四に、パスワードの暗号化

  1. パスワードは次のように暗号化されます。
  • データベースがユーザーによって侵害された場合、リークしてはならない最後のことはユーザー情報です
  • 攻撃方法:ユーザー名とパスワードを取得してから、他のシステムにログインしてみてください
  • 予防策:パスワードを暗号化します。パスワードを取得しても、平文がわかりません。
  1. パスワードはnodeJS、次のように暗号化されたアプリケーションプログラムです。
  • cryp.js、コードは次のとおりです。
const crypto = require('crypto')

// 密钥
const SECRET_KEY = 'Wzs_sd274#'

// md5 加密
function md5(content) {
    
    
  let md5 = crypto.createHash('md5')
  return md5.update(content).digest('hex')
}

// 加密函数
function genPassword(password) {
    
    
  const str = `password=${
      
      password}&key=${
      
      SECRET_KEY}`
  return md5(str)
}

// const result = genPassword('123')
// console.log(result)

module.exports = {
    
    
  genPassword
}
  • user.js、コードは次のとおりです。
const {
    
     exec, escape } = require('../db/mysql')
const {
    
     genPassword } = require('../utils/cryp')

const login = (username, password) => {
    
    
  // 先使用假数据
  // if (username === 'zhangsan' && password === '123') {
    
    
  //   return true
  // }
  // return false

  username = escape(username)
  
  // 生成加密密码
  password = genPassword(password)
  password = escape(password)

  const sql = `select username, realname from users where username=${
      
      username} and password=${
      
      password};`
  
  return exec(sql).then(rows => {
    
    
    return rows[0] || {
    
    }
  })
}

module.exports = {
    
    
  login
}

おすすめ

転載: blog.csdn.net/weixin_42614080/article/details/111055966