216.73.216.139 TODAY : 221

PHP ์˜จ๋ผ์ธ ๊ฐ•์˜

 > 

PHP - ์ค‘๊ธ‰

๐Ÿ“š PHP ์ค‘๊ธ‰ - 8์ฃผ์ฐจ: ์›น ๋ณด์•ˆ ๊ธฐ์ดˆ ๋ฐ ์—๋Ÿฌ ํ•ธ๋“ค๋ง- 01 XSS, CSRF ๊ณต๊ฒฉ ์ดํ•ด ๋ฐ ๋ฐฉ์–ด

๐Ÿ“š PHP ์ค‘๊ธ‰ - 8์ฃผ์ฐจ: ์›น ๋ณด์•ˆ ๊ธฐ์ดˆ ๋ฐ ์—๋Ÿฌ ํ•ธ๋“ค๋ง- 01 XSS, CSRF ๊ณต๊ฒฉ ์ดํ•ด ๋ฐ ๋ฐฉ์–ด
ํ‰์  10.0 ๋ผ์ด์„ผ์Šค free
์‚ฌ์šฉ์žํ‰์  10.0 ์šด์˜์ฒด์ œ
๋‹ค์šด๋กœ๋“œ 1 ํŒŒ์ผํฌ๊ธฐ 0
์ œ์ž‘์‚ฌ LUZENSOFT ๋“ฑ๋ก์ผ 2025-08-13 14:00:44
์กฐํšŒ์ˆ˜ 14
- ์„ค๋ช…

๐Ÿ“š PHP ์ค‘๊ธ‰ - 8์ฃผ์ฐจ: ์›น ๋ณด์•ˆ ๊ธฐ์ดˆ ๋ฐ ์—๋Ÿฌ ํ•ธ๋“ค๋ง- 01 XSS, CSRF ๊ณต๊ฒฉ ์ดํ•ด ๋ฐ ๋ฐฉ์–ด


์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ๋•Œ ๊ธฐ๋Šฅ ๊ตฌํ˜„๋งŒํผ ์ค‘์š”ํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ #๋ณด์•ˆ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ #๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๊ณ , #์„œ๋น„์Šค์˜ #๋ฌด๊ฒฐ์„ฑ์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ์ ์ธ #์›น๋ณด์•ˆ ์ง€์‹์„ ๊ฐ–์ถ”๋Š” ๊ฒƒ์€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์›น์—์„œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” #XSS์™€ #CSRF ๊ณต๊ฒฉ์˜ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์ด๋ฅผ ๋ฐฉ์–ดํ•˜๊ธฐ ์œ„ํ•œ #PHP ์ฝ”๋”ฉ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.



#1 XSS (Cross-Site Scripting) ๊ณต๊ฒฉ ์ดํ•ด์™€ ๋ฐฉ์–ด

uploadImage


XSS๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ #๊ฒŒ์‹œํŒ์ด๋‚˜ #๋Œ“๊ธ€ ๋“ฑ์— ์•…์˜์ ์ธ #์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋„๋ก ์œ ๋„ํ•˜๋Š” ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค. ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ์‚ฌ์šฉ์ž์˜ #์ฟ ํ‚ค๋‚˜ #์„ธ์…˜ ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•˜๊ฑฐ๋‚˜, ์›น ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์„ ๋ณ€์กฐํ•˜๋Š” ๋“ฑ ์‹ฌ๊ฐํ•œ ํ”ผํ•ด๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ์–ด ๋ฐฉ๋ฒ•: ์ž…๋ ฅ ๊ฐ’ ๊ฒ€์ฆ ๋ฐ ์ถœ๋ ฅ ์‹œ ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ

๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ๋ฐฉ์–ด์ฑ…์€ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ๋ฐ›์€ ๋ชจ๋“  #๋ฐ์ดํ„ฐ๋ฅผ ์‹ ๋ขฐํ•˜์ง€ ์•Š๊ณ , ๋ฐ˜๋“œ์‹œ ๊ฒ€์ฆํ•˜๊ณ  #์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. PHP์—์„œ๋Š” htmlspecialchars() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTML ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ณ€ํ™˜ํ•จ์œผ๋กœ์จ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PHP

<?php
// ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๊ฐ’
$user_input = "<script>alert('XSS ๊ณต๊ฒฉ!');</script>";

// htmlspecialchars() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ˆ˜ ๋ฌธ์ž๋ฅผ HTML ์—”ํ‹ฐํ‹ฐ๋กœ ๋ณ€ํ™˜
$safe_output = htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');

// ์ถœ๋ ฅ ๊ฒฐ๊ณผ: <script>alert('XSS ๊ณต๊ฒฉ!');</script>๊ฐ€ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ๋จ
echo $safe_output; 
?>

htmlspecialchars() ํ•จ์ˆ˜๋Š” < > & " '์™€ ๊ฐ™์€ ํŠน์ˆ˜๋ฌธ์ž๋ฅผ HTML ์—”ํ‹ฐํ‹ฐ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋ฅผ ์ˆœ์ˆ˜ํ•œ ํ…์ŠคํŠธ๋กœ ์ธ์‹ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.



#2 CSRF (Cross-Site Request Forgery) ๊ณต๊ฒฉ ์ดํ•ด์™€ ๋ฐฉ์–ด

uploadImage


#CSRF๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š์€ ์š”์ฒญ์„ ๋ณด๋‚ด๋„๋ก ์œ ๋„ํ•˜์—ฌ ๊ณต๊ฒฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์ž‘์—…์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•œ ์ƒํƒœ์—์„œ ์•…์„ฑ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ–ˆ์„ ๋•Œ, ๋ณด์ด์ง€ ์•Š๋Š” ๊ณณ์—์„œ #๊ณ„์ • ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ์ด๋‚˜ #๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ์™€ ๊ฐ™์€ ์š”์ฒญ์ด ์ž๋™์œผ๋กœ ์ „์†ก๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋ฐฉ์–ด ๋ฐฉ๋ฒ•: CSRF ํ† ํฐ ์‚ฌ์šฉ

uploadImage

CSRF ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ #CSRFํ† ํฐ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. CSRF ํ† ํฐ์€ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜๋งˆ๋‹ค ๊ณ ์œ ํ•˜๊ฒŒ ์ƒ์„ฑ๋˜๋Š” ๋ฌด์ž‘์œ„ ๋ฌธ์ž์—ด๋กœ, ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ ์ด ํ† ํฐ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.


1. ํผ(Form) ์ƒ์„ฑ ์‹œ ํ† ํฐ ์ถ”๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” #HTML #ํผ์— ์ˆจ๊ฒจ์ง„(hidden) ์ž…๋ ฅ ํ•„๋“œ๋กœ CSRF ํ† ํฐ์„ ํฌํ•จ์‹œํ‚ต๋‹ˆ๋‹ค.

PHP

<?php
// ์„ธ์…˜์ด ์‹œ์ž‘๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์‹œ์ž‘
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

// CSRF ํ† ํฐ ์ƒ์„ฑ
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
?>

<form action="process.php" method="POST">
    <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
    <input type="text" name="data">
    <button type="submit">์ „์†ก</button>
</form>


2. ์š”์ฒญ ์ฒ˜๋ฆฌ ์‹œ ํ† ํฐ ๊ฒ€์ฆ ์š”์ฒญ์„ ๋ฐ›๋Š” ์„œ๋ฒ„ ์ธก #์Šคํฌ๋ฆฝํŠธ์—์„œ ์„ธ์…˜์— ์ €์žฅ๋œ ํ† ํฐ๊ณผ ํผ์„ ํ†ตํ•ด ์ „๋‹ฌ๋ฐ›์€ ํ† ํฐ์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

uploadImage

PHP

<?php
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

if (!empty($_POST['csrf_token']) && hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
    // ํ† ํฐ์ด ์œ ํšจํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌ
    // ...
    echo "์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.";
} else {
    // ํ† ํฐ์ด ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉด ์š”์ฒญ์„ ๊ฑฐ๋ถ€
    // ...
    echo "์œ ํšจํ•˜์ง€ ์•Š์€ ์š”์ฒญ์ž…๋‹ˆ๋‹ค.";
}
?>

hash_equals() ํ•จ์ˆ˜๋Š” ๋ฌธ์ž์—ด ๋น„๊ต์— ์‚ฌ์šฉ๋˜๋ฉฐ, ๋‘ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ ๋‹ค๋ฅผ ๊ฒฝ์šฐ์—๋„ ํ•ญ์ƒ ๋™์ผํ•œ ์‹คํ–‰ ์‹œ๊ฐ„์„ ๋ณด์žฅํ•˜์—ฌ #ํƒ€์ด๋ฐ๊ณต๊ฒฉ(timing attack)์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.



์š”์•ฝ ๋ฐ ๊ฒฐ๋ก 


#์›น๊ฐœ๋ฐœ์—์„œ #๋ณด์•ˆ์€ ์„ ํƒ์ด ์•„๋‹Œ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. XSS ๊ณต๊ฒฉ์€ #์ž…๋ ฅ๊ฐ’๊ฒ€์ฆ๊ณผ #์ถœ๋ ฅ์ด์Šค์ผ€์ดํ”„๋ฅผ ํ†ตํ•ด, CSRF ๊ณต๊ฒฉ์€ #CSRFํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ํšจ๊ณผ์ ์œผ๋กœ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. PHP์˜ ๋‚ด์žฅ ํ•จ์ˆ˜์™€ #์„ธ์…˜ ๊ธฐ๋Šฅ์„ ์ ๊ทน ํ™œ์šฉํ•˜์—ฌ ์•ˆ์ „ํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.


PHP ์›น๋ณด์•ˆ XSS CSRF ๋ฐฉ์–ด ์ž…๋ ฅ๊ฐ’ ์ด์Šค์ผ€์ดํ”„ CSRFํ† ํฐ ๋ณด์•ˆ๊ฐ•ํ™” ์›น๊ฐœ๋ฐœ ์„ธ์…˜ GET POST



๊ตญ๋‚ด์ตœ๋‹ค ๋‹ค๋Œ€์—ญ๋ณด์œ , KT๋ณธ์‚ฌIP, ๋ธ”๋กœ๊ทธ/์‡ผํ•‘/SNS/์ง€๋„๋งˆ์ผ€ํŒ…,IP๊ต์ฒด๊ถŒ๋ฌด๋ฃŒ์ง€๊ธ‰

https://xn--299ao67b9qbmsf04c.net/๏ปฟ