Share
## https://sploitus.com/exploit?id=2EDA1648-F8F2-5CB3-929A-28FD86CA8A6E
# poc-crud
๋ ๊ฐ์ง PoC(Proof of Concept)์, ์ด๋ฅผ ์กฐํฉํด ๋ง๋ JSON ํ์ผ ๊ธฐ๋ฐ CRUD ์ฝ์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ด์ ์ค์ต ํ๋ก์ ํธ์
๋๋ค.
## ์คํ ํ๊ฒฝ
- Python 3.13 (`.venv` ๊ฐ์ํ๊ฒฝ ํฌํจ)
- ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ถํ์ (ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์ฌ์ฉ)
```bash
.venv/Scripts/python.exe json_poc.py
.venv/Scripts/python.exe quick_sort_poc.py
.venv/Scripts/python.exe crud_app.py
```
Windows ์ฝ์์์ ํ๊ธ์ด ๊นจ์ ธ ๋ณด์ด๋ฉด ์๋์ฒ๋ผ UTF-8 ์ถ๋ ฅ์ ๊ฐ์ ํ์ธ์.
```bash
PYTHONIOENCODING=utf-8 .venv/Scripts/python.exe json_poc.py
```
## 1. `json_poc.py` โ JSON ํ์ฑ / ์ ์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ PoC
ํ์ค `json` ๋ชจ๋๋ก JSON ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ๋ณธ ํ๋ฆ์ ๊ฒ์ฆํฉ๋๋ค.
| ๋จ๊ณ | ๋ด์ฉ | ์ฌ์ฉ ํจ์ |
| --- | --- | --- |
| 1 | dict โ JSON ๋ฌธ์์ด (์ง๋ ฌํ) | `json.dumps` |
| 2 | JSON ๋ฌธ์์ด โ dict (์ญ์ง๋ ฌํ) | `json.loads` |
| 3 | dict โ JSON ํ์ผ ์ ์ฅ | `json.dump` |
| 4 | JSON ํ์ผ โ dict ์ฝ๊ธฐ | `json.load` |
| 5 | ์๋ชป๋ ํ์์ JSON ํ์ฑ ์ ์๋ฌ ์ฒ๋ฆฌ | `json.JSONDecodeError` |
| 6 | `datetime` ๋ฑ ๊ธฐ๋ณธ์ผ๋ก ์ง๋ ฌํ ์ ๋๋ ํ์
์ฒ๋ฆฌ | `dumps(default=...)` |
**ํต์ฌ ํฌ์ธํธ**
- `ensure_ascii=False`๋ฅผ ์ค์ผ ํ๊ธ์ด ์ ๋์ฝ๋ ์ด์ค์ผ์ดํ(`\uXXXX`) ์์ด ๊ทธ๋๋ก ์ ์ฅ๋จ.
- ์๋ชป๋ JSON์ ์์ธ(`JSONDecodeError`)๋ก ์คํจํ๋ฏ๋ก ๋ฐ๋์ `try/except`๋ก ๊ฐ์ธ์ผ ํจ.
- `datetime`์ฒ๋ผ JSON์ด ๊ธฐ๋ณธ ์ง์ํ์ง ์๋ ํ์
์ `default=` ์ฝ๋ฐฑ์ผ๋ก ์ง์ ๋ณํ ๋ก์ง์ ์ง์ ํด์ผ ์ง๋ ฌํ ๊ฐ๋ฅ.
## 2. `quick_sort_poc.py` โ Quick Sort ์๊ณ ๋ฆฌ์ฆ PoC
ํต ์ ๋ ฌ์ ๋ชจ๋ฅธ๋ค๊ณ ๊ฐ์ ํ๊ณ , ์๋ฆฌ๋ถํฐ ๋จ๊ณ๋ณ๋ก ๊ตฌํํฉ๋๋ค.
**ํต์ฌ ์์ด๋์ด**
1. ๋ฆฌ์คํธ์์ ๊ธฐ์ค๊ฐ(pivot)์ ํ๋ ๊ณ ๋ฅธ๋ค.
2. ๋๋จธ์ง ๊ฐ๋ค์ pivot๋ณด๋ค ์์ ๊ทธ๋ฃน(left) / ๊ฐ์ ๊ทธ๋ฃน(mid) / ํฐ ๊ทธ๋ฃน(right)์ผ๋ก ๋๋๋ค.
3. left, right์ ๋ํด ๊ฐ์ ๊ณผ์ ์ ์ฌ๊ท์ ์ผ๋ก ๋ฐ๋ณตํ๋ค. ์์๊ฐ 0~1๊ฐ๋ฉด ๊ทธ ์์ฒด๋ก ์ ๋ ฌ ์๋ฃ.
4. `์ ๋ ฌ๋ left + mid + ์ ๋ ฌ๋ right` ์์๋ก ์ด์ด ๋ถ์ด๋ฉด ์ ์ฒด ์ ๋ ฌ ์๋ฃ.
ํ๊ท ์๊ฐ๋ณต์ก๋๋ O(n log n)์ด๋ฉฐ, pivot์ ๋งค๋ฒ ์ต์๊ฐ/์ต๋๊ฐ์ผ๋ก ๋ฝ๋ ์ต์
์ ๊ฒฝ์ฐ O(nยฒ)๊น์ง ๋๋ ค์ง ์ ์์ต๋๋ค.
**ํฌํจ๋ ๋ ๊ฐ์ง ๊ตฌํ**
| ๊ตฌํ | ํจ์ | ํน์ง |
| --- | --- | --- |
| ์ค๋ช
์ฉ ๊ตฌํ | `quick_sort_explained` | ๋ฆฌ์คํธ ์ปดํ๋ฆฌํจ์
์ผ๋ก ๋ถํ , ๋ฉ๋ชจ๋ฆฌ๋ ๋ ์ฐ์ง๋ง ์ง๊ด์ |
| in-place ๊ตฌํ | `quick_sort_inplace` / `_partition` | Lomuto partition ๋ฐฉ์, ์๋ณธ ๋ฐฐ์ด ๋ด์์ ๊ตํํ๋ฉฐ ์ ๋ ฌ |
`demo()` ์คํ ์ ๋ ๊ตฌํ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ด์ฌ ๋ด์ฅ `sorted()`์ ๋น๊ต ๊ฒ์ฆํ๊ณ , ๋๋ค ๋ฐ์ดํฐ๋ก 5ํ ๋ฐ๋ณต ํ
์คํธ๋ฅผ ์ํํฉ๋๋ค.
์ถ๊ฐ๋ก, dict ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ ์ ์๋๋ก ์ผ๋ฐํํ `quick_sort_by_key(items, key=...)` ํจ์๋ ํฌํจ๋์ด ์์ต๋๋ค. ์ด ํจ์๊ฐ ์๋ CRUD ์ฑ์ ์ ๋ ฌ ๊ธฐ๋ฅ์ ์ฌ์ฉ๋ฉ๋๋ค.
## 3. `crud_app.py` โ JSON ํ์ผ ๊ธฐ๋ฐ ํ์ ๊ด๋ฆฌ CRUD ์ฝ์ ์ฑ
`json_poc.py`์ ํ์ผ ์
์ถ๋ ฅ ํจํด๊ณผ `quick_sort_poc.py`์ `quick_sort_by_key`๋ฅผ ์กฐํฉํด ๋ง๋ ์ฝ์ ์ ํ๋ฆฌ์ผ์ด์
์
๋๋ค. ํ์(id, name, age, email) ๋ฐ์ดํฐ๋ฅผ `members.json` ํ์ผ์ ์ ์ฅํ๋ฉฐ CRUD ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
```bash
.venv/Scripts/python.exe crud_app.py
```
**๋ฉ๋ด ๊ตฌ์ฑ**
| ๋ฉ๋ด | ๊ธฐ๋ฅ | ์ค๋ช
|
| --- | --- | --- |
| 1 | ์ ์ฒด ์กฐํ | id/name/age ์ค ์ ๋ ฌ ๊ธฐ์ค๊ณผ asc/desc ์์๋ฅผ ์ ํํด ๋ชฉ๋ก ์ถ๋ ฅ (๋ด๋ถ์ ์ผ๋ก `quick_sort_by_key` ์ฌ์ฉ) |
| 2 | ์ถ๊ฐ | ์ด๋ฆ/๋์ด/์ด๋ฉ์ผ ์
๋ ฅ๋ฐ์ ์ ํ์ ์์ฑ (id๋ ๊ธฐ์กด ์ต๋๊ฐ+1๋ก ์๋ ๋ถ์ฌ) |
| 3 | ๋จ๊ฑด ์กฐํ | id๋ก ํน์ ํ์ ๊ฒ์ |
| 4 | ์์ | id๋ก ํ์์ ์ฐพ์ ์ด๋ฆ/๋์ด/์ด๋ฉ์ผ ์ค ์ํ๋ ๊ฐ๋ง ๋ณ๊ฒฝ (์ํฐ ์ ๊ธฐ์กด ๊ฐ ์ ์ง) |
| 5 | ์ญ์ | id๋ก ํ์์ ์ฐพ์ ํ์ธ(y/N) ํ ์ญ์ |
| 6 | ์ข
๋ฃ | ์ฑ ์ข
๋ฃ |
**๋์ ๋ฐฉ์**
- ์ฑ ์์ ์ `members.json`์ด ์์ผ๋ฉด ์ฝ์ด์ค๊ณ , ์์ผ๋ฉด ๋น ๋ชฉ๋ก์ผ๋ก ์์.
- Create/Update/Delete๊ฐ ์ผ์ด๋ ๋๋ง๋ค ์ฆ์ `members.json`์ `json.dump(..., ensure_ascii=False, indent=2)`๋ก ๋ฐ์ (๋ฐ์ดํฐ ์ ์ค ๋ฐฉ์ง).
- JSON ํ์ผ์ด ์์๋์ด ํ์ฑ์ ์คํจํ๋ฉด ์๋ฌ๋ฅผ ๋ด์ง ์๊ณ ๋น ๋ชฉ๋ก์ผ๋ก ์์ ํ๊ฒ ์์.
- ์ซ์ ์
๋ ฅ(id, ๋์ด)์ `int()` ๋ณํ ์คํจ ์ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ณ ํด๋น ๋์๋ง ์ทจ์, ์ฑ ์์ฒด๋ ์ข
๋ฃ๋์ง ์์.