header-img
Info :
728x90

SQL INJECTION ์ด๋ž€?

์‚ฌ์šฉ์ž๊ฐ€ ์ •์ƒ์ ์ธ ์ž…๋ ฅ์ด ์•„๋‹Œ ๋น„์ •์ƒ์ ์ธ ์ž„์˜์˜ SQL ๋ฌธ์„ ์ž…๋ ฅํ•ด์„œ DB์— ๋น„์ •์ƒ์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ..
๋น„์ •์ƒ์ ์ด์ง€๋งŒ ์ปดํ“จํ„ฐ๋Š” ๋น„์ •์ƒ์ธ๊ฑธ ๋ชฐ๋ผ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค ์ค˜๋ฒ„๋ฆฐ๋‹ค (๋ฌธ์ œ)

SQL INJECTION ๋ณด์•ˆ ๋ฐฉ๋ฒ•

  1. ์ž…๋ ฅ ๊ฐ’์— ๋Œ€ํ•œ ๊ฒ€์ฆ (์ง€๊ธˆ ํ• ๊ฑฐ์ž„)
  2. Prepared Statement ๊ตฌ๋ฌธ ์‚ฌ์šฉ - ํ•œ์ค„๋กœ ์กฐํšŒ ๋•Œ๋ ค๋ฒ„๋ฆฌ์ง€๋ง๊ณ  ๋‚˜๋ˆ ์„œ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์ด ๋ ๋งŒํ•œ ์• ๋“ค์€ ๋ณ€์ˆ˜๋‚˜ ์ด๋Ÿฐ๋ฐ ์ €์žฅ๋†“๊ณ  ๋ฝ€๊ฐœ์„œ ์“ฐ๋ž€ ์†Œ๋ฆฌ
  3. Error Message ๋…ธ์ถœ ๊ธˆ์ง€ - ๋””ํ…Œ์ผ ํ•œ ๊ฒƒ๋“ค์€ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ๊ฐœ๋ฐœ์ž๋งŒ ๋ณด์ž...
  4. ๋ฐฉํ™”๋ฒฝ ์‚ฌ์šฉ

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

๋‚˜๋Š” ์•ž์—์„œ ๋งํ•œ ๋ณด์•ˆ ๋ฐฉ๋ฒ•๋“ค ์ค‘ 1๋ฒˆ ์ž…๋ ฅ ๊ฐ’์— ๋Œ€ํ•œ ๊ฒ€์ฆ์„ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

ํ”ํžˆ ๋งํ•˜๋Š” ์ •๊ทœ์‹์„ ์‚ฌ์šฉ ํ•œ ๊ฒƒ์ธ๋ฐ..

์ •๊ทœ์‹(Regular Expressions)๋ž€?

์ •๊ทœ์‹์ด ๋ˆ„๊ตฐ๋ฐ...


์ด ์‚ฌ๋žŒ์€ ์˜์–ด์ด๋ฆ„ regex ํ•ด๋„ ๋˜์„œ ์ข‹๊ฒ ๋‹ค..

ํ…์ŠคํŠธ์—์„œ ํŒจํ„ด์„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€ํ™”๋œ '์–ธ์–ด'
ํŠน๋ณ„ํ•œ ์˜๋ฏธ๋กœ ์ธ์‹๋˜๋Š” ๋ฉ”ํƒ€๋ฌธ์ž ์™€ ์ผ๋ฐ˜ ๋ฌธ์ž์ธ ์ •๊ทœ ๋ฌธ์ž๋ฅผ ์ด์šฉํ•ด์„œ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.


์ด๋Ÿฐ ๋А๋‚Œ์œผ๋กœ...

sql์— ์‚ฌ์šฉ๋˜๋Š” ํŠน์ˆ˜๋ฌธ์ž ๋ช‡๊ฐ€์ง€๋ฅผ ๋ง‰์•„์คŒ์œผ๋กœ์จ ์•ฝ๊ฐ„์˜ ๋ณด์•ˆ์„ ์ง„ํ–‰ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

์ฝ”๋“œ

  const checkSearchedWord = useCallback((event) => {
    var expText = /[%=*><]/;
      if (expText.test(event.key) == true) {
        alert("๋ณด์•ˆ: ํŠน์ˆ˜๋ฌธ์ž(%,=,*,>,<)๋Š” ์ž…๋ ฅ ํ• ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
        event.preventDefault();
      }

      // // ํŠน์ • ๋ฌธ์ž์—ด(sql์˜ˆ์•ฝ์–ด์˜ ์•ž ๋’ค ๊ณต๋ฐฑ ํฌํ•จ) ์ œ๊ฑฐ
      // var sqlArray = new Array(
      //   "SELECT", "INSERT", "DELETE", "UPDATE", "CREATE", "DROP", "EXEC",
      //   "UNION", "FETCH", "DECLARE", "TRUNCATE"
      // );

      // var regex;
      // for (var i=0; i<sqlArray.length; i++){
      //   regex = new RegExp(sqlArray[i], "gi");

      //   if(regex.test(event.key)){
      //     alert("["+sqlArray[i]+"]์™€(๊ณผ)๊ฐ™์€ ํŠน์ •๋ฌธ์ž๋กœ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
      //     event.preventDefault();
      //   }
      // }
  },[])

๋‚˜๋Š” ์ฒซ๋ฒˆ์งธ ๋ถ€๋ถ„์ธ /[%=*><]/ ๋งŒ ๋ง‰์•„์ฃผ๋„๋ก ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด์„œ ์•„๋ž˜ ๋ถ€๋ถ„์€ ์ฃผ์„์ฒ˜๋ฆฌ ํ•ด๋‘์—ˆ๋‹ค.

ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋„ฃ์–ด๋‘๊ณ  ์จ๋„ ์ข‹๊ฒ ์ง€๋งŒ ํ•„์ž์˜ ๊ฒฝ์šฐ์—๋Š” onkeydown ์ด๋ฒคํŠธ์— ๊ฑธ์–ด๋‘๊ณ ์ž ํ•˜์—ฌ...
์ด๋ ‡๊ฒŒ ํ•จ์ˆ˜๋กœ ๋นผ๋Š” ๊ฒƒ์„ ํฌ๊ธฐํ•˜์˜€๋‹ค ~

์•„๋ฌดํŠผ 1๋ฒˆ์งธ ๋ถ€๋ถ„์€ ํŠน๋ฌธ ๋ง‰๋Š” ๋ถ€๋ถ„!
๋‘๋ฒˆ์งธ ๋ถ€๋ถ„์€์€ sql๊ณผ ๊ด€๋ จ๋œ ๋‹จ์–ด๋ฅผ ๋ง‰๋Š” ๋ถ€๋ถ„์ด๋‹ค.

์ „๋ถ€ ๋ฌธ์ž๋ฅผ ์ธ์‹ํ•˜๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ alert ๋ฉ”์„ธ์ง€๋ฅผ ํ•œ๋ฒˆ ๋„์›Œ์ฃผ๊ณ , ์“ด ๊ธ€์ž ๊ฐ’์€ default๋กœ ๋Œ๋ ค๋ฒ„๋ฆฐ๋‹ค.

<input type='text' onKeyDown={checkSearchedWord}>

์ด๋Ÿฐ ์‹์œผ๋กœ ๊บผ๋‚ด์“ฐ๋ฉด ๋š๋”ฑ์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ %=*>< ๊ฐ™์€ ํŠน์ˆ˜๋ฌธ์ž๋ฅผ input์— ์ž…๋ ฅํ•˜๊ฒŒ ๋˜๋ฉด !

์ด๋ ‡๊ฒŒ ๋œจ๊ณ  input์—๋Š” ์•„์˜ˆ ์ž…๋ ฅ๋„ ๋˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

ps. ๋‚ด๊ฐ€ ์ฃผ์„ ์ฒ˜๋ฆฌ ํ•ด๋‘” ๋‹จ์–ด ๋ถ€๋ถ„์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์œผ๋ฉด
๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ์— match ๋ฅผ ํ™œ์šฉํ•ด์„œ ์ € ๋‹จ์–ด๋“ค์„ ์ฐพ์•„๋‚ด๊ณ , ์žˆ์œผ๋ฉด return์„ ํ•ด์ฃผ๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค...!

728x90
๋”๋ณด๊ธฐ
FRONTEND/React