
PHP ์จ๋ผ์ธ ๊ฐ์
>PHP - ์ค๊ธ
๐ 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) ๊ณต๊ฒฉ ์ดํด์ ๋ฐฉ์ด
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) ๊ณต๊ฒฉ ์ดํด์ ๋ฐฉ์ด
#CSRF๋ ์ฌ์ฉ์๊ฐ ์๋ํ์ง ์์ ์์ฒญ์ ๋ณด๋ด๋๋ก ์ ๋ํ์ฌ ๊ณต๊ฒฉ์๊ฐ ์ํ๋ ์์ ์ ์คํ์ํค๋ ๊ณต๊ฒฉ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ ์ํ์์ ์ ์ฑ ์น์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ์ ๋, ๋ณด์ด์ง ์๋ ๊ณณ์์ #๊ณ์ ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ์ด๋ #๊ฒ์๊ธ ์ญ์ ์ ๊ฐ์ ์์ฒญ์ด ์๋์ผ๋ก ์ ์ก๋ ์ ์์ต๋๋ค.
๋ฐฉ์ด ๋ฐฉ๋ฒ: CSRF ํ ํฐ ์ฌ์ฉ
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. ์์ฒญ ์ฒ๋ฆฌ ์ ํ ํฐ ๊ฒ์ฆ ์์ฒญ์ ๋ฐ๋ ์๋ฒ ์ธก #์คํฌ๋ฆฝํธ์์ ์ธ์ ์ ์ ์ฅ๋ ํ ํฐ๊ณผ ํผ์ ํตํด ์ ๋ฌ๋ฐ์ ํ ํฐ์ด ์ผ์นํ๋์ง ํ์ธํฉ๋๋ค.
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/๏ปฟ