์จ๋ผ์ธ ๊ฐ์
>PHP - ์ค๊ธ
๐ PHP ์ค๊ธ - 8์ฃผ์ฐจ: ์น ๋ณด์ ๊ธฐ์ด ๋ฐ ์๋ฌ ํธ๋ค๋ง- 01 XSS, CSRF ๊ณต๊ฒฉ ์ดํด ๋ฐ ๋ฐฉ์ด
				์ฃผ์ ํ๋ก๊ทธ๋จ ์คํ
- ํ์ : 10.0
 - ๋ผ์ด์ ์ค: free
 - ์ด์์ฒด์ :
 - ํ์ผ ํฌ๊ธฐ: 0
 
ํผ๋๋ฐฑ ๋ฐ ๋ค์ด๋ก๋
- ์ฌ์ฉ์ ํ์ : 10.0
 - ๋ค์ด๋ก๋ ์: 1
 - ์กฐํ์: 83
 
์ ์กฐ์ฌ ๋ฐ ๋ฑ๋ก ์ ๋ณด
- ์ ์์ฌ: LUZENSOFT
 - ๋ฑ๋ก์ผ: 2025-08-13 14:00:44
 
- ์ค๋ช
๐ 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/๏ปฟ