Dev Blog posted on Hugo
- Tracks of my dev life
- Ark for oblivion
- Milestone for wanderer
Dev Blog posted on Hugo
Database ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ ์ฅํ์ฌ ๊ด๋ฆฌํ๋ ์์คํ ์ Database๋ผ๊ณ ํ๋ค. Database ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ์กฐ์ํ๊ธฐ ์ํด์ DBMS(DataBase Management System) ์ ์ฌ์ฉํ๋ค. Database๋ ํํ์ ๋ฐ๋ผ ํฌ๊ฒ Relational Database (๊ด๊ณํ DB), Non-Relational Database(๋น๊ด๊ณํ DB) ๋ก ๋ถ๋ฅ๋๋ค. Relational Database : ํ ์ด๋ธ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌ Non-Relational Database : key-value ์ธํธ๋ก ๊ตฌ์ฑ๋ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌ(ex: json format) RDBMS (Relational Database Management System) Relational Database ์กฐ์์ ์ํ ์์คํ ์ ์๋ฏธํ๋ค. Codds ์์ ์ ์ํ 12๊ฐ์ง ์ ์์ ๋ฐ๋ฅด๋๋ก ์ค๊ณ๋๋ค. (๋ณดํต์ ์ ๋์ 2๊ฐ์ง ๊ท์น๋ง ํ์๋ก ๋ฐ๋ฅธ๋ค.) SQL (Structured Query Language) ์ด๋ผ๋ ์ฟผ๋ฆฌ ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ Database๋ฅผ ์กฐ์ํ๋ค. SQL (Structured Query Language) RDBMS์ ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๊ณ ์ง์, ์์ ๋ฑ์ ํ๊ธฐ ์ํด ๊ณ ์๋ ์ธ์ด๋ก, ๋ค์ ์ธ๊ฐ์ง ์ข ๋ฅ์ ์ธ์ด๋ฅผ ํฌํจํ๋ค. DDL (Data Definition Language) : ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๊ธฐ ์ํ ์ธ์ด๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ฑ/์์ /์ญ์ ๋ฑ์ ํ์๋ฅผ ์ํ DML (Data Manipulation Language) : ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๊ธฐ ์ํ ์ธ์ด๋ก ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด์ ์กด์ฌํ๋ ๋ฐ์ดํฐ์ ๋ํด ์กฐํ/์ ์ฅ/์์ /์ญ์ ๋ฑ์ ํ์๋ฅผ ์ํ DCL(Data Control Language) : ์ ๊ทผ ๊ถํ์ ์ค์ ํ๊ธฐ ์ํ ์ธ์ด NoSQL Non-Relational Database ๋ฅผ ์ํ ์ธ์ด๋ก, Non-Relational DBMS ๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค. SQL๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ณต์กํ์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด ๋จ์ ๊ฒ์ ๋ฐ ์ถ๊ฐ ๊ฒ์ ์์ ์ ์ํด ๋งค์ฐ ์ต์ ํ๋์๊ณ , ์ ์ฅ๊ณต๊ฐ์ด ํฌ๋ค๋ ๊ฒ์ด ํน์ง์ด๋ค. key-value ์กฐํฉ์ผ๋ก ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ธฐ์ ๋ฌธ๋ฒ์ด ๋ฐ๋ก ์๋ค๋ ๊ฒ๋ ์ฅ์ ์ด๋ค. MongoDB, Redis, CouchDB ๋ฑ์ด ํด๋น๋๋ค. MongoDB : Json ํํ๋ก ํ ์ด๋ธ ๊ด๋ฆฌ Redis : ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ DBMS๋ก ์๋๊ฐ ๋นจ๋ผ ์์๋ฐ์ดํฐ ์บ์ฑ ์ฉ๋๋ก ์ฃผ๋ก ์ฌ์ฉ CouchDB : ์ด๋ ์น ๊ธฐ๋ฐ์ DBMS๋ก, REST API ํ์์ผ๋ก ์์ฒญ์ ์ฒ๋ฆฌ ๋ฌธ๋ฒ MongoDB ๋ฐ์ดํฐ ์ฝ์ ...
๊ณต๊ฒฉ ๋ฐฉ๋ฒ ๋ถ๋ฅ Server side ๊ณต๊ฒฉ ๋ฐฉ๋ฒ Injection (์ธ์ ์ ) ์๋ฒ์ ์ฒ๋ฆฌ ๊ณผ์ ์ค ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ฐ์ดํฐ๊ฐ ์์คํ ์ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ฃผ๊ฑฐ๋ ๋ฌธ๋ฒ์ ์ผ๋ก ์ฌ์ฉ๋์ด ๋ฐ์ํ๋ ์ทจ์ฝ์ injection ๊ณต๊ฒฉ์ ์ข ๋ฅ SQL Injection Command Injection SSTI (Server Side Template Injection) Path Traversal SSRF (Server Side Request Forgery) ORM๊ณผ ๊ฐ์ด ๊ฒ์ฆ๋ SQL ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฉ์ด๊ฐ ํ์ํ๋ค. File vulnerability ์๋ฒ์ ํ์ผ ์์คํ ์ ์ฌ์ฉ์๊ฐ ์ํ๋ ํ์๋ฅผ ํ ์ ์์ ๋ ๋ฐ์ํ๋ ์ทจ์ฝ์ system(PHP), child_process(Node JS), os.system(Python) ๋ฑ OS command๋ฅผ ์คํํ๋ ํจ์๋ฅผ ํธ์ถํ์ง ์๋ ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ ์ข์ผ๋, ์ ๋ ฅ ํํฐ๋ง์ด๋ ๋์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ํ์ ์ค์ผ ์ ์๋ค. Business Logic Vulnerability (๋น์ฆ๋์ค ๋ก์ง ์ทจ์ฝ์ ) ์ธ์ ์ , ํ์ผ ๊ด๋ จ ์ทจ์ฝ์ ๋ค๊ณผ๋ ๋ค๋ฅด๊ฒ ์ ์์ ์ธ ํ๋ฆ์ ์ ์ฉํ๋ ๊ฒ Language specific Vulnerability (PHP, Python, NodeJS) ์น ์ดํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ๋ ์ธ์ด์ ํน์ฑ์ผ๋ก ์ธํด ๋ฐ์ํ๋ ์ทจ์ฝ์ Misconfiguration ์๋ชป๋ ์ค์ ์ผ๋ก ์ธํด ๋ฐ์ํ๋ ์ทจ์ฝ์ Debug mode๋ฅผ ์ค์ ํ ์ฑ๋ก ๋ฐฐํฌํ๋ ๊ฒฝ์ฐ ์์/๋ฐฑ์ ํ์ผ์ ์ญ์ ํ์ง ์์ ๊ฒฝ์ฐ ๋ฐฑ์ ํ์ผ ์ข ๋ฅ bak : ๋ฐฑ์ ํ์ผ, ๋๋ถ๋ถ์ ์๋ํฐ์์ ์ฌ์ฉํจ config : ์ค์ ํ์ผ, ๋น๋ฐ ํค๋ค์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ sql : sql schema ํ์ผ, ๋ฐ์ดํฐ ๋ฒ ์ด์ค ๊ตฌ์กฐ๋ฅผ ์์๋ผ ์ ์์ sh : shell script ํ์ผ ~ : bluefish ์๋ํฐ ๋ฐฑ์ ํ์ผ ์๋น์ค์๋ ๋ฌด๊ดํ ํ์ผ๋ค์ ์ ๊ฑฐํด์ ์ํ์ ์์จ ์ ์์ VCS ํ๋ก๊ทธ๋จ์ผ๋ก ์ธํ ์์ ํ์ผ๋ค์ ์ ๋ฆฌํด์ผ ํ๋ค. .git, .hg ๋ฑ์ ํ์ผ์ด ์๋ค. https://github.com/kost/dvcs-ripper ์ ๋ณด๋ฅผ ์ฐธ์กฐํ์ฌ ์ง๋จ์ด ๊ฐ๋ฅํ๋ค. ์น ์๋ฒ์ ์ค์ ์ผ๋ก VCS ํ์ผ์ ๊ฒฝ๋ก์ ์ ๊ทผ์ ๋ง๋ ๋ฐฉ๋ฒ๋ ๊ฐ๋ฅํ๋ค. location ~ /\.(git|hg) { deny all; } ๋คํธ์ํฌ ๋ฐ์ธ๋ฉ์ 0.0.0.0 ์ผ๋ก ์ธํ ํ๋ ๊ฒฝ์ฐ ํธ์๋ฅผ ์ํด ์ธํ ํ ์ค์ ์ ์ด์ ํ๊ฒฝ์ด ๋ณ๊ฒฝ๋์์์๋ ๊ทธ๋๋ก ์ ์งํ์ฌ ๋ฐ์ํ ์ ์๋ ์ทจ์ฝ์ ์ด๋ค. ๋ด๋ถ ๋ง์์๋ง ์ ๊ทผํ ์ ์๋ ์๋น์ค๋ mask๋ฅผ ์ ๋๋ก ์ค์ ํด ์ฃผ๊ณ , ํ์ฉํ ํฌํธ๋ฅผ ์ ์ธํ ์ค์ ์ ๋ชจ๋ ์ญ์ ํ๋๋ก ํ์ฌ ์ํ์ ์ ๊ฑฐํ๋ค. ์ทจ์ฝ์ XSS (Cross Site Scripting) ๊ณต๊ฒฉ์๊ฐ ์น ๋ฆฌ์์ค์ ์ ์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ ํด ์ด์ฉ์์ ์น ๋ธ๋ผ์ฐ์ ์์ ํด๋น ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ๊ณต๊ฒฉ์ด๋ค. XSS ์ทจ์ฝ์ ์ด ์กด์ฌํ๋ ์ฌ์ดํธ์ ๊ณต๊ฒฉ์๋ origin ๊ถํ์ผ๋ก ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ํฌํจ๋ ํ์ด์ง๋ฅผ ๋ง๋ค์ด์ ์ด์ฉ์๊ฐ ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ํฌํจ๋ ํ์ด์ง๋ฅผ ๋ฐฉ๋ฌธํ๋ฉด ๊ณต๊ฒฉ์์ ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ๋์ํด ์ ๋ณด๋ฅผ ํ์ทจํ๋ ๋ฐฉ์์ด๋ค. ๊ณต๊ฒฉ ๊ฒฝ๋ก XSS ๊ณต๊ฒฉ์ ์ด์ฉ์๊ฐ ์ฝ์ ํ ๋ด์ฉ์ ์ถ๋ ฅํ๋ ๊ธฐ๋ฅ์์ ๋ฐ์ํ๋ค. ์ ์ฑ ํ๊ทธ๋ฅผ ํํฐ๋งํ๋ HTML Sanitization์ ์ฌ์ฉํ๊ฑฐ๋ ์ํฐํฐ ์ฝ๋๋ก ์นํํ๋ ๋ฐฉ๋ฒ์ผ๋ก XSS๋ฅผ ์๋ฐฉํ ์ ์๋ค. Flask๋ render_template ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์๋ฅผ HTML ์ํฐํฐ์ฝ๋๋ก ๋ณํํ์ฌ ์ถ๋ ฅํ๋ ๋ฐฉ์์ผ๋ก XSS๋ฅผ ๋ฐฉ์งํ๋ค. ์๋์ ๊ฐ์ด ์ ๋ ฅ๊ฐ์ ๊ทธ๋๋ก ์ถ๋ ฅํ๊ฒ ๋๋ฉด, ์ ๋ ฅ๊ฐ์ผ๋ก script ๋ฅผ ์ ๋ฌํด ๊ณต๊ฒฉ์ ์ฌ์ฉํ ์ ์๋ค. ์๋ฒ์ ์ฝ๋ @app.route("/vulnerable") def vulnerable(): param = request.args.get("param", "") # ์ด์ฉ์๊ฐ ์ ๋ ฅํ ์ธ์๋ฅผ ๊ฐ์ ธ์ด return param # ์ด์ฉ์์ ์ ๋ ฅ๊ฐ์ ํ๋ฉด ์์ ํ์ ๊ณต๊ฒฉ์ ์ ๋ ฅ1. ๋ค๋ฅธ ํ์ด์ง๋ก redirection <script>location.href = "/another_page?param=PARAM1";</script> ๊ณต๊ฒฉ์ ์ ๋ ฅ2. cookie ์ ๋ณด ์ถ๋ ฅ <script>document.cookie</script> XSS ๊ณต๊ฒฉ ์ข ๋ฅ XSS ๋ ์ ์ฑ ์คํฌ๋ฆฝํธ์ ์์น์ ์นจํฌ ๊ฒฝ๋ก์ ๋ฐ๋ผ ์๋์ ๊ฐ์ด ๊ตฌ๋ถ๋๋ค. Stored XSS : XSS์ ์ฌ์ฉ๋๋ ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ์๋ฒ์ ์ ์ฅ๋๊ณ ์๋ฒ์ ์๋ต์ ๋ด๊ฒจ์ค๋ XSS ๊ฒ์๋ฌผ๊ณผ ๋๊ธ์ ์ ์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ํฌํจํด ์ ๋ก๋ํ๋ ๋ฐฉ์์ด ์์ ๋ถํน์ ๋ค์์๊ฒ ๋ณด์ฌ์ง๊ธฐ ๋๋ฌธ์ ํ๊ธ๋ ฅ์ด ํฌ๋ค. Reflected XSS : XSS์ ์ฌ์ฉ๋๋ ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ URL์ ์ฝ์ ๋๊ณ ์๋ฒ์ ์๋ต์ ๋ด๊ฒจ์ค๋ XSS ๊ฒ์ํ ์๋น์ค์์ ์์ฑ๋ ๊ฒ์๋ฌผ์ ์กฐํํ๊ธฐ ์ํ ๊ฒ์์ฐฝ์์ ์คํฌ๋ฆฝํธ๋ฅผ ํฌํจํด ๊ฒ์ํ๋ ๋ฐฉ์์ด ์์ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์๋ต์ ํฌํจํ๋ ์ผ๋ถ ์๋น์ค์์ ๋ฐ์ ๊ฐ๋ฅ ๊ณต๊ฒฉ์ ์ํด์๋ ๋ค๋ฅธ ์ด์ฉ์๋ฅผ ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ํฌํจ๋ ๋งํฌ์ ์ ์ํ๋๋ก ์ ๋ํด์ผ ํจ DOM-based XSS : XSS์ ์ฌ์ฉ๋๋ ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ URL Fragment์ ์ฝ์ ๋๋ XSS Universal XSS : ํด๋ผ์ด์ธํธ์ ๋ธ๋ผ์ฐ์ ํน์ ๋ธ๋ผ์ฐ์ ์ ํ๋ฌ๊ทธ์ธ์์ ๋ฐ์ํ๋ ์ทจ์ฝ์ ์ผ๋ก SOP ์ ์ฑ ์ ์ฐํํ๋ XSS CSRF (Cross Site Request Forgery) ์ด๋ค ์ฌ์ดํธ์์ ์ด์ฉ์์ ์ ์ ์ ๋ณด๊ฐ ํฌํจ๋ ์ฟ ํค๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ํ์ธ์ ์ฟ ํค๋ฅผ ํ์ทจํ์ฌ ๋ณ์กฐ๋ ๋ช ๋ น์ ์๋ฒ๋ก ๋ฒ๋ฌํ๋ ๊ณต๊ฒฉ ๋ฐฉ์์ด๋ค. ์ด์ฉ์์ ์ ์ ์ ๋ณด๊ฐ ํฌํจ๋ ์ฟ ํค๋ ์ผ์ข ์ ์๋ช ๊ณผ ๊ฐ์ ์ญํ ์ ํ๊ธฐ ๋๋ฌธ์, ์ฟ ํค๊ฐ ํน์ ๋ช ๋ น์ ๋ํ ์ด์ฉ์์ ๋ณธ์ธ ์ธ์ฆ ์ญํ ์ ์ํํ ์๋ ์๋ค. 2์ฐจ ์ธ์ฆ์ ์ํํ์ง ์๊ณ cookie๋ก๋ง ์ธ์ฆ์ ํ๋ ์ฌ์ดํธ์ ๋ํด ๊ณต๊ฒฉ์ด ๊ฐ๋ฅํ๋ค. XSS๋ ์ธ์ฆ ์ ๋ณด์ธ ์ธ์ ๋ฐ ์ฟ ํค ํ์ทจ๋ฅผ ๋ชฉ์ ์ผ๋ก ์๋ฒ์์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ ํ๋ ๋ฐฉ์์ธ ๋ฐ๋ฉด, CSRF๋ ์ด์ฉ์๊ฐ ์์ ํ์ด์ง์ HTTP ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ ๋ชฉ์ ์ผ๋ก ํ๋ ๊ณต๊ฒฉ์ด๋ค. ๊ณต๊ฒฉ ๊ฒฝ๋ก <img> ํ๊ทธ๋ <form> ํ๊ทธ๋ฅผ ํ์ฉํด์ ์ฌ์ฉ์๊ฐ ์๋ํ์ง ์์ ๋ช ๋ น์ ์๋ฒ์ ์์ฒญํ๋ script๋ฅผ ์คํ์ํฌ ์ ์๋ค. /* img ํ๊ทธ ํ์ฉ ์์ฒญ ์ ๋ฌ */ <img src='http://bank.dreamhack.io/sendmoney?to=Dreamhack&amount=1337' width=0px height=0px>` /* javascript ๊ณต๊ฒฉ ์์ */ /* ์ ์ฐฝ ๋์ฐ๊ธฐ */ window.open('http://bank.dreamhack.io/sendmoney?to=Dreamhack&amount=1337'); /* ํ์ฌ ์ฐฝ ์ฃผ์ ์ฎ๊ธฐ๊ธฐ */ location.href = 'http://bank.dreamhack.io/sendmoney?to=Dreamhack&amount=1337'; location.replace('http://bank.dreamhack.io/sendmoney?to=Dreamhack&amount=1337'); SQL Injection ์กฐ์๋ SQL ์ฟผ๋ฆฌ๋ฅผ ์๋ฒ์ ์ฃผ์ ํ์ฌ ์ธ์ฆ์ ์ฐํํ๊ฑฐ๋, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ณด๋ฅผ ์ ์ถํ๋ ๊ณต๊ฒฉํ์ Blind SQL Injection : SQL Injection ์ ํ ์ข ๋ฅ๋ก, DBMS๊ฐ ๋ต๋ณ ๊ฐ๋ฅํ ํํ๋ก ์ง๋ฌธ์ ์ํํ์ฌ ์ค๋ฌด๊ณ ๊ฐ ๊ฒ์๊ณผ ๊ฐ์ด ์ ๋ต์ ์ ์ถํด ๋๊ฐ๋ ๊ณต๊ฒฉ ๊ธฐ๋ฒ NoSQL Injection NoSQL์ ๋ฐ์ดํฐ ํ์ ์ผ๋ก โ์ค๋ธ์ ํธโ ๋ผ๋ ๊ฐ๋ ์ ๊ฐ๋๋ค. ์ค๋ธ์ ํธ ํ์ ์ ์ ๋ ฅ๊ฐ์ ์ฒ๋ฆฌํ ๋์๋ ์ฟผ๋ฆฌ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , ์ด ๋ถ๋ถ์ ์ทจ์ฝ์ ์ ํ์ฉํ ๊ฒ์ด NoSQL Injection ์ด๋ค. NodeJs๋ฅผ ์๋ฅผ ๋ค๋ฉด ์๋์ ๊ฐ์ด url์ object๋ฅผ ๋์ ํ ์ ์๋ค. // ์๋ฒ ์ฝ๋ ์์ const express = require('express'); const app = express(); app.get('/', function(req,res) { console.log('data:', req.query.data, ' / type:', typeof req.query.data); res.send('done'); }); const server = app.listen(3000, function(){ console.log('app.listen'); }); // ๊ฒฐ๊ณผ ์์ http://localhost:3000/?data=1234 data: 1234 type: string http://localhost:3000/?data[]=1234 data: [ '1234' ] type: object http://localhost:3000/?data[]=1234&data[]=5678 data: [ '1234', '5678' ] type: object http://localhost:3000/?data[5678]=1234 data: { '5678': '1234' } type: object http://localhost:3000/?data[5678]=1234&data=0000 data: { '5678': '1234', '0000': true } type: object http://localhost:3000/?data[5678]=1234&data[]=0000 data: { '0': '0000', '5678': '1234' } type: object http://localhost:3000/?data[5678]=1234&data[1111]=0000 data: { '1111': '0000', '5678': '1234' } type: object ์ด ๋ฐฉ๋ฒ์ผ๋ก ์๋์ ๊ฐ์ด โdataโ ๊ฐ์ฒด ์์ NoSQL ์ฟผ๋ฆฌ๊ฐ ๋ค์ด๊ฐ๋๋ก url์ ์ค์ ํ ์๋ ์๋ค. NoSQL ๋ฌธ๋ฒ ์ฐธ์กฐ http://localhost:3000/?data[$eq]=A data: { "$eq": "A" } type: object Command Injection ๊ณต๊ฒฉ์๊ฐ ํด๋ผ์ด์ธํธ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์๋ฒ์ธก์ ์์คํ ๋ช ๋ น์ด๋ฅผ ์ ๋ฌํ์ฌ ์คํ์์ผ ๊ณต๊ฒฉ์ ์ํํ๋ ๊ธฐ๋ฒ PHP์ system, Node JS์ child_process, ํ์ด์ฌ์ os.system ๊ณผ ๊ฐ์ด ์์คํ ๋ช ๋ น์ด๋ฅผ ์ํํ๋ ํจ์์ ์ด์ฉ์๊ฐ ์์์ ์ธ์๋ฅผ ์ ๋ฌํ ์ ์์ ๋ ๋ฐ์ํ ์ ์๋ค. ๋ช ๋ น์ด ์ ๋ ฅ๋์ ๋ค๋ฅธ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ ๊ธฐ๋ฒ์๋ ๋ค์์ ๋ฉํ๋ฌธ์ ๋ค์ ํ์ฉํ ์ ์๋ค. ๋ช ๋ น์ด ์นํ ๋ฆฌ๋ ์ค ์์์ `` ์ฌ์ด์ ๋ ๋ฌธ์๋ ์๋ก์ด ๋ช ๋ น์ด ๋ผ์ธ์ผ๋ก ์ธ์ํ๋ค. ex) echo `ls` ls ๋ช ๋ น์ด๊ฐ ์คํ๋๋ค. ๋ฆฌ๋ ์ค ์์์ $() ์ฌ์ด์ ๋ ๋ฌธ์๋ ์๋ก์ด ๋ช ๋ น์ด ๋ผ์ธ์ผ๋ก ์ธ์ํ๋ค. ex) echo $(ls) ls ๋ช ๋ น์ด๊ฐ ์คํ๋๋ค. ๋ช ๋ น์ด ์ฐ์ ์คํ ๋ฆฌ๋ ์ค ์์์ || ๋ฅผ ์ฌ์ฉํ๋ฉด, || ์๊ณผ || ๋ค๋ฅผ ๋ค๋ฅธ ๋ช ๋ น์ด ๋ผ์ธ์ผ๋ก ์ธ์ํ๊ณ ๊ฐ๊ฐ ์คํํ๋ค. ํ ์ค์ ๋ ์ด์์ ๋ช ๋ น์ด๋ฅผ ์คํ์ํฌ ์ ์๋ค. ex) mkdir FILE || cd FILE FILE ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ FILE ๋๋ ํฐ๋ฆฌ ์์ผ๋ก ์ด๋ํ๋ ๋ช ๋ น์ ํ์ค๋ก ์ํํ ์ ์๋ค. ๋ฆฌ๋ ์ค ์์์ && ๋ฅผ ์ฌ์ฉํ๋ฉด, && ์๊ณผ && ๋ค๋ฅผ ๋ค๋ฅธ ๋ช ๋ น์ด ๋ผ์ธ์ผ๋ก ์ธ์ํ๊ณ ๊ฐ๊ฐ ์คํํ๋ค. ex) mkdir FILE && cd FILE FILE ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ FILE ๋๋ ํฐ๋ฆฌ ์์ผ๋ก ์ด๋ํ๋ ๋ช ๋ น์ ํ์ค๋ก ์ํํ ์ ์๋ค. ๋ฆฌ๋ ์ค ์์์ ; ๋ฅผ ์ฌ์ฉํ๋ฉด, ; ์๊ณผ ; ๋ค๋ฅผ ๋ค๋ฅธ ๋ช ๋ น์ด ๋ผ์ธ์ผ๋ก ์ธ์ํ๊ณ ๊ฐ๊ฐ ์คํํ๋ค. ex) mkdir FILE ; cd FILE FILE ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ FILE ๋๋ ํฐ๋ฆฌ ์์ผ๋ก ์ด๋ํ๋ ๋ช ๋ น์ ํ์ค๋ก ์ํํ ์ ์๋ค. ํ์ดํ ๋ฆฌ๋ ์ค ์์์ | ๋ฅผ ์ฌ์ฉํ๋ฉด | ์์ ๋ช ๋ น์ด ์คํ ๊ฒฐ๊ณผ๋ฅผ | ๋ค์ ๋ช ๋ น์ด ์คํ์ ์ ๋ ฅ์ผ๋ก ์ค์ ํ ์ ์๋ค. ex) cat FILE | less FILE ๋ด์ฉ์ ์ถ๋ ฅํ ๊ฒ์ less ๋ช ๋ น์ผ๋ก ๋๋ ์ ๋ณผ ์ ์๋๋ก ํ๋ค. ๋ท๋ด์ฉ ๋ฌด์ ๋ฆฌ๋ ์ค ์์์ #์ ์ฌ์ฉํ๋ฉด # ๋ค์ ๋ด์ฉ์ ์ฃผ์์ฒ๋ฆฌ๋์ด ๋ฌด์๋๋ค. ex) ls #a"sdfa"sdโfas"โโdf ๊ตฌ๋ฌธ ์ค๋ฅ ์์ด ls ๋ช ๋ น์ด ์ ์คํ๋๋ค. ๋ฌธ์์ด์ whitelist ์ฒ๋ฆฌํ๊ฑฐ๋ blacklist ์ฒ๋ฆฌํ์ฌ ๊ณต๊ฒฉ์ ๋ฐฉ์ดํ ์ ์๋ค. ์ ๊ท์์ ํตํด IP ์ฃผ์ ํฌ๋ฉง์ whitelist ๋ก ์ง์ ํ๋ ์ฝ๋ import re, os, ... ... chk_ip = re.compile('^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$') if bool(chk_ip.match(ip)): return run_system(f'ping -c 3 {ip}') else: return 'ip format error' ํ์ฉ๋๋ฉด ์๋๋ ๋ฌธ์์ด์ blacklist ๋ก ์ง์ ํ๋ ์ฝ๋ if '\'' in ip: return 'not allowed character' return run_system(f'ping -c 3 \'{ip}\'') # shell command ์์์ ๋ชจ๋ ์ ๋ ฅ์ ๋ฌธ์์ด๋ก ์ฒ๋ฆฌํ๋ Single Quotes (')๋ฅผ ์ฌ์ฉํด์ผ ํจ system(PHP), child_process(Node JS), os.system(Python) ๋ฑ OS command๋ฅผ ์คํํ๋ ํจ์ ์ธ ๋์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ํ์ ์ค์ผ ์ ์๋ค. File Vulnerability ๊ณต๊ฒฉ์์ ํ์ผ์ ์น ์๋น์ค์ ํ์ผ ์์คํ ์ ์ ๋ก๋ ํน์ ํ๋ ๊ณผ์ ์์ ๋ฐ์ํ๋ ๋ณด์ ์ทจ์ฝ์ ํ์ผ ์ ๋ก๋/๋ค์ด๋ก๋ ์๋น์ค๋ฅผ ๊ฐ๋ฐ์ ์ด์ฉ์๊ฐ ์ ๋ก๋ํ ํ์ผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ๊ฒ๋ณด๋ค๋ ์๋ฒ์ ํ์ผ ์์คํ ์ ์ ์ฅํ๋ ๊ฒ์ด ๊ฐ๋ฐํ๊ธฐ ์ฝ๊ณ , ๊ด๋ฆฌ ํจ์จ๋ ๋์ง๋ง File Vulnerability๋ฅผ ์ฃผ์ํด์ผ ํ๋ค. ์๊ฒฉ ์ฝ๋ ์คํ, ๋ฏผ๊ฐ์ ๋ณด ํ์ทจ ๋ฑ์ด ์ํ๋ ์ ์๋ค. File Upload Vulnerability ...
Youtoube Download Window OS์์ Python์ผ๋ก Youtube ์์์ ๋ค์ด๋ก๋ ํ๋ ๋ฐฉ๋ฒ 1. Python Code ์์ฑ yt-dlp ํจํค์ง๋ฅผ ๋ค์ด๋ฐ๋๋ค. pip install yt-dlp ๋ช ๋ น์ผ๋ก ์์ฝ๊ฒ ๋ค์ด๋ก๋ ๊ฐ๋ฅํ๋ค. github ์ฃผ์๋ ๋ค์๊ณผ ๊ฐ๋ค. : https://github.com/yt-dlp/yt-dlp ์ฝ๋๋ฅผ ์์ฑํ๋ค. ์๋๋ ์ํ ์ฝ๋์ด๋ค. import yt_dlp import os import time ########## # ์ค์ ########## # ์ต๋ ์ฌ์๋ ํ์ MAX_RETRIES = 3 # ์ฌ์๋ ์ฌ์ด์ ๋๊ธฐ ์๊ฐ (์ด) RETRY_DELAY = 5 # ๋ค์ด๋ก๋ ๋ฆฌ์คํธ download_lists = [ { "name": 'FOLDER_NAME', # ๋ค์ด๋ก๋ ๋ฐ์ ํด๋ ์ด๋ฆ "url": 'https://www.youtube.com/watch?v=CJuIRe_1c2g&list=RDMM&start_radio=1&rv=R4CecLdF11E', # ๋ค์ด๋ก๋ ํ playlist URL }, { "name": 'SAMPLE2', "url": 'https://www.youtube.com/watch?v=66l5r_IEZrI&list=RDGMEMYH9CUrFO7CfLJpaD7UR85w&start_radio=1&rv=CJuIRe_1c2g', }, ] ########## # ๋ค์ด๋ก๋ ์์ ########## for idx, list in enumerate(download_lists): # 'ํด๋์ด๋ฆ/์์์ ๋ชฉ.ํ์ฅ์' ํ์์ผ๋ก ๋ค์ด๋ก๋ output_dir = os.path.join(f'./{list["name"]}/', '%(title)s.%(ext)s') ydl_opt = { 'outtmpl': output_dir, 'format': 'bestaudio/best', # ๋ค์ด๋ก๋ํ ํฌ๋งท ์ง์ 'download_archive': 'downloaded.txt', # ๋ค์ด๋ก๋ ์์นด์ด๋ธ ํ์ผ ์ง์ (๋ฏธ๋ฆฌ ๋ค์ด๋ฐ์ ํญ๋ชฉ๋ค์ ์ฒดํฌํ์ฌ ์ค๋ณต์ผ๋ก ๋ฐ์ง ์๋๋ก ํ๋ ๊ธฐ๋กํ์ผ) 'postprocessors': [{ 'key': 'FFmpegExtractAudio', 'preferredcodec': 'mp3', # mp3ํฌ๋ฉง์ผ๋ก ๋ณํ 'preferredquality': '192', }], 'verbose': True, # ์์ธํ ๋๋ฒ๊น ์ ๋ณด ์ถ๋ ฅ 'ignoreerrors': True, # ๋ค์ด๋ก๋ ์ค๋ฅ ๋ฌด์ } for attempt in range(1, MAX_RETRIES + 1): try: with yt_dlp.YoutubeDL(ydl_opt) as ydl: ydl.download([ list["url"] ]) print(f'{list["name"]}:: ๋ค์ด๋ก๋ ์๋ฃ') break except Exception as e: print(f'{list["name"]}:: ๋ค์ด๋ก๋ ์คํจ ({attempt}/{MAX_RETRIES}): {e}') if attempt < MAX_RETRIES: print(f'{list["name"]}:: {RETRY_DELAY}์ด ํ ๋ค์ ์๋ํฉ๋๋ค...') time.sleep(RETRY_DELAY) else: print(f'{list["name"]}:: ์ต๋ ์ฌ์๋ ํ์๋ฅผ ์ด๊ณผํ์ต๋๋ค. ๋ค์ด๋ก๋๋ฅผ ์ค๋จํฉ๋๋ค.') print('๋ชจ๋ ํญ๋ชฉ ๋ค์ด๋ก๋ ์๋ฃ') ๋ค๋ฅธ๊ฒ๋ค์ ์์ ํ ํ์ ์๊ณ , download_lists ์ ๋ค์ด๋ก๋ ํ Youtube ์ฌ์๋ชฉ๋ก์ ๋ฃ์ด์ค๋ค. ...
Cookie HTTP์ ํน์ง(Connectionless, Stateless) ๋๋ฌธ์ Web Server ๋ HTTP๋ก ์์ฒญ๋ ํจํท๋ค์ด ์ด๋ค Web Client์์ ์ ๋ฌ๋ ๊ฒ์ธ์ง ๊ตฌ๋ถํ ์ ์๋ค. IP ์ฃผ์์ User-Agent ๋ฑ์ ์ ๋ณด๋ ๋งค๋ฒ ๋ณ๊ฒฝ๋ ์ ์๋ค. Client์ ์ ๋ณด์ ์์ฒญ์ ๋ด์ฉ์ ๊ตฌ์ฒดํํ๊ธฐ ์ํด, Server๋ Client ๋ง๋ค ๊ณ ์ ํ Cookie๋ฅผ ๋ฐ๊ธํ๊ณ , Client๋ Server์ ์์ฒญ์ ๋ณด๋ผ ๋๋ง๋ค Cookie๋ฅผ ๊ฐ์ด ์ ์กํ๋ค. Server๋ Request ํจํท์ ๋ค์ด์๋ Cookie ๋ฅผ ํตํด Client์ ์ ๋ณด์ ์ํ๋ฅผ ๊ธฐ๋กํ๋ค. Cookie ๋ key-value ๋ก ๊ตฌ์ฑ๋ ํ์ผ์ด๋ฉฐ, Client ์ ์ ์ฅ๋๋ค. Cookie์ ๋จ์ 4KB์ ํฌ๊ธฐ ์ ํ ์ฟ ํค๋ก ์ธํด ์น์ ๋ฐ์์ฑ์ด ๋๋ ค์ง ์ ์์ ๋๋ฉ์ธ ๋ด์ ๋ชจ๋ ํ์ด์ง๊ฐ ๊ฐ์ ์ฟ ํค๋ฅผ ์ ๋ฌ ๋ฐ์ HTTP ํ๋กํ ์ฝ๋ก Cookie ์์ฒญ์ ์ํธํ ๋์ง ์์ ๋ณด์์ด ์ทจ์ฝํจ ์ฟ ํค๋ ์ฌ์ฉ์์ ๋ก์ปฌ์ ํ ์คํธ๋ก ์ ์ฅ ๋์ด์์ด ์ฝ๊ฒ ๋ด์ฉ ํ์ธ์ด ๊ฐ๋ฅํจ ์ ์์ ์ธ Client ๊ฐ Cookie ๋ฅผ ๋ณ์กฐํ ์ ์์ Modern Storage APIs Cookie ์ ๋จ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ด๋ค. Local storage, Session storage ๋ฑ์ด ์๋ค. Session Session ์ Server ์์ ์์ฑํ ๋๋คํ ๋ฌธ์์ด์ด๊ณ , Server ๊ฐ Client ๋ง๋ค ๊ณ ์ ํ ๊ฐ์ ๋ฐ๊ธํ๋ค. ...
Web HTTP๋ฅผ ์ด์ฉํ์ฌ ์ ๋ณด๋ฅผ ๊ณต์ ํ๋ ์ธํฐ๋ท ๊ธฐ๋ฐ ์๋น์ค๋ฅผ Web์ด๋ผ ํ๋ค. ์ ๋ณด ์ ๊ณต์๋ฅผ Web Server, ์ ๋ณด ์์ ์๋ฅผ Web Client๋ผ ์นญํ๋ค. ํ์ฌ์ ์น์ ๋จ์ ์ ๋ณด ์ ๊ณต์ ๋ ๋ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ํํ๋ก ๋ฐ์ ํ๊ณ ์์ผ๋ฉฐ, Front end ์ Back end ๋ก ์ญํ ์ด ๋๋์ด์ง๊ณ ์๋ค. Front end : Web resource๋ก ๊ตฌ์ฑ๋ ์ฌ์ฉ์์๊ฒ ์ง์ ๋ณด์ฌ์ง๋ ๋ถ๋ถ Back end : ์ฌ์ฉ์์๊ฒ ์ง์ ๋ณด์ฌ์ง์ง๋ ์์ง๋ง ์๋น์ค ์ ๊ณต์ ์ํด ๊ตฌ๋๋๋ ๋ถ๋ถ Web Resource ์น์ ๊ฐ์ถฐ์ง ์ ๋ณด ์์ฐ์ ์๋ฏธํ๋ฉฐ, ์ฌ์ฉ์์๊ฒ ์ ๊ณต๋์ด ํ๋ฉด์ ๊ตฌ์ฑํ๋๋ฐ ์ฌ์ฉ๋๋ค. ๊ณ ์ ํ ์๋ณ์์ธ Uniform Resource Identifier (URI)๋ฅผ ๊ฐ์ง๋ค. ๋ํ์ ์ธ ์น ๋ฆฌ์์ค์ ์ข ๋ฅ Hyper Text Markup Language (HTML) : ํ๊ทธ์ ์์ฑ์ ํตํ ๊ตฌ์กฐํ๋ ๋ฌธ์ ์์ฑ์ ์ฌ์ฉ. ์ค๋ช ์ฐธ์กฐ Cascading Style Sheets (CSS) : ์น ๋ฌธ์์ ์ธํ์ ์กฐ์ ํ๋๋ฐ ์ฌ์ฉ. ์ค๋ช ์ฐธ์กฐ JavaScript (JS) : ์ด์ฉ์์ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ ์ฝ๋๋ก front end ์ ๋์์ ๊ฒฐ์ . ์ค๋ช ์ฐธ์กฐ text image video font Web browser Client ์ ์์น์์ Server ์ HTTP ํต์ ์ ์ํํด์ฃผ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ํ ํด ์ฃผ๋ ๋๊ตฌ๋ก, ์ฌ์ฉ์๊ฐ HTTP ํต์ ์ ์ง์ ์์ง ๋ชปํด๋ Web์ ์ฌ์ฉํ ์ ์๊ฒ ํด ์ค๋ค. ๋์ ์์ URL ๋ถ์ DNS ์์ฒญ HTTP Request get HTTP Respond ๋ฆฌ์์ค ๋ค์ด๋ก๋ ๋ฐ ์น ๋๋๋ง Dev Tool Web browser ์์ ์ฌ์ฉํ ์ ์๋ ๊ฐ๋ฐ์ ๋๊ตฌ Ctrl + U : ์์ค์ฝ๋ ๋ณด๊ธฐ ๋จ์ถํค console.log : ์ฝ์์ฐฝ์ ๋ก๊ทธ ์ถ๋ ฅ document.cookie : ์ฝ์์ฐฝ์์ ์ฟ ํค ์ถ๋ ฅ location.href : ์ ์ฒด URL ์ ๋ฐํํ๊ฑฐ๋, URL์ ์ ๋ฐ์ดํธ URL(Uniform Resource Locator) ์น์ ์๋ ๋ฆฌ์์ค์ ์์น๋ฅผ ํํํ๋ ๋ฌธ์์ด URL ์ ๊ตฌ์ฑ ์์ Scheme: ์น ์๋ฒ์ ์ด๋ค ํ๋กํ ์ฝ๋ก ํต์ ํ ์ง ๋ํ๋ ๋๋ค. Host: Authority์ ์ผ๋ถ๋ก, ์ ์ํ ์น ์๋ฒ์ ์ฃผ์์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. Port: Authority์ ์ผ๋ถ๋ก, ์ ์ํ ์น ์๋ฒ์ ํฌํธ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. Path: ์ ๊ทผํ ์น ์๋ฒ์ ๋ฆฌ์์ค ๊ฒฝ๋ก๋ก โ/โ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. Query: ์น ์๋ฒ์ ์ ๋ฌํ๋ ํ๋ผ๋ฏธํฐ์ด๋ฉฐ URL์์ โ?โ ๋ค์ ์์นํฉ๋๋ค. Fragment: ๋ฉ์ธ ๋ฆฌ์์ค์ ์กด์ฌํ๋ ์๋ธ ๋ฆฌ์์ค๋ฅผ ์ ๊ทผํ ๋ ์ด๋ฅผ ์๋ณํ๊ธฐ ์ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ต๋๋ค. โ#โ ๋ฌธ์ ๋ค์ ์์นํฉ๋๋ค. Domain name ์ซ์์ ์กฐํฉ์ผ๋ก ์ด๋ฃจ์ด์ง IP ์ฃผ์๋ฅผ ์ฌ๋์ด ์ฝ๊ธฐ ์ฌ์ด ํํ์ ๋ฌธ์์ด๋ก ๋์ฒดํ ํํ Domain name ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ DNS๊ฐ ํ์ํ๋ค. DNS(Domain Name Server) ์ Domain name ์ ์ง์ํ๋ฉด DNS ๋ ๋งคํ๋๋ IP ๋ฅผ ๋ฐํํ๋ค. ์ฝ์์ nslookup ๋ช ๋ น์ผ๋ก domain name ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๋ค. ex) nslookup google.com ...