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()` ๋ณ€ํ™˜ ์‹คํŒจ ์‹œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ํ•ด๋‹น ๋™์ž‘๋งŒ ์ทจ์†Œ, ์•ฑ ์ž์ฒด๋Š” ์ข…๋ฃŒ๋˜์ง€ ์•Š์Œ.