SQL Injection

mgm-dev·2020년 11월 20일
0

web security 101

목록 보기
1/2

📚TL;DR

  1. SQL Injection(SQL 삽입) : 프로그램의 취약성을 사용해, 악의적인 SQL문을 실행 시켜, DB를 공격하는 코드 인잭션 공격 방법
  1. sanitizing : 병균을 소독 하듯이, 악의적인 데이터/코드를 제거하는 작업

Sample Server(Node.js)

const express = require('express')
const app = express()
const port = 3000

app.use(express.json())

const mysql = require('mysql')
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'db',
})

connection.connect()

app.post('/', function (req, res) {
  console.log(req.body)
  const { id, pw } = req.body
  const query = `SELECT * FROM user WHERE id = '${id}' AND pw = '${pw}'`

  connection.query(query, (error, results, fields) => {
    if (error) {
      console.log(error)
    }
    res.send(results)
  })
})

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})

Sample Injection

{
	"id" : "admin",
	"pw" : "password'; DROP TABLE user;--"
}
const query = `SELECT * FROM user WHERE id = '${id}' AND pw = '${pw}'`
// "SELECT * FROM user WHERE id = 'admin' AND pw = 'password'; DROP TABLE user;--'"

! 위 예시가 실제로 먹히지는 않는다
node-mysql 모듈은 기본적으로 statement 를 1개 씩 받기 때문에(SQL Injection 방지), 위 코드는 에러를 일으킨다.


Sanitization

escape()

const id = req.body.id
const sql = 'SELECT * FROM user WHERE id=' + connection.escape(id)
connection.query(sql, function(err, rows) {
  ...
});

placeholders

const { id, pw } = req.body
const sql = 'INSERT INTO users(id, pw) VALUES(?, ?)'
const params = [id, pw]
connection.query(sql, params, function(err, rows) {
  ...
});

SQL Injection을 방지하기 위해 escape() 함수로 악의적으로 쓰일 수 있는 입력값을 제거하거나, ?를 통해 placeholder를 사용 할 수 있다.

profile
never stop learning

관심 있을 만한 포스트

0개의 댓글

관심 있을 만한 포스트