5μ₯. ν΄λΌμ΄μΈνΈ μ¬μ΄λ μ
λ ₯ κ²μ¦
- μ€μμ±
- μ λ ₯ κ²μ¦μ΄ νμν μ£Όμ 보μ μν
μ€μ΅μμ£Ό
벨리λ°μ΄μ
x
보μλ§!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1μ₯. μ λͺ© 1. νμ μ λͺ© (1) νμ μ λͺ© 1) νμ μ λͺ© 1. νμ μ λͺ© 2. νμ μ λͺ© 2μ₯. μ λͺ©
1. μ€μμ±
μΉ μ ν리μΌμ΄μ
μμ μ¬μ©μκ° μ
λ ₯νλ λ°μ΄ν°λ μ λ’°ν μ μλ μΆμ²λ‘ κ°μ£Όν΄μΌ νλ€. μ¬μ©μκ° μλμ μΌλ‘ μ
μ± μ½λλ₯Ό ν¬ν¨ν λ°μ΄ν°λ₯Ό μ
λ ₯ν μ μκΈ° λλ¬Έμ, νλ‘ νΈμλ κ°λ°μλ μ ν리μΌμ΄μ
μ λͺ¨λ μ
λ ₯ κ°μ λν΄ μ λ’°ν μ μλμ§μ λν κ²μ¦μ μνν΄μΌ νλ€.
μ
λ ₯ κ²μ¦μ λͺ©μ μ μ ν리μΌμ΄μ
μ΄ μμνμ§ λͺ»ν μ
λ ₯μ μ²λ¦¬νλ κ³Όμ μμ λ°μν μ μλ λ€μν 보μ μνμ λ°©μ§νλ κ²μ΄λ€. μ
λ ₯ κ²μ¦μ 보μμ μΈ λͺ©μ μΈμλ λ°μ΄ν° 무결μ±μ 보μ₯νκ³ , μλͺ»λ λ°μ΄ν°λ‘ μΈν΄ λ°μν μ μλ μ ν리μΌμ΄μ
μ€λ₯λ₯Ό μ€μ΄λ μν μ νλ€.
νλ‘ νΈμλμμ μ
λ ₯ κ²μ¦μ μννλ μ΄μ λ λ€μκ³Ό κ°λ€.
νλ‘ νΈμλμμ μ
λ ₯ κ²μ¦μ μν
- λΉ λ₯Έ νΌλλ°± μ 곡: μ¬μ©μκ° λ°μ΄ν°λ₯Ό μ λ ₯ν λ μ€μκ°μΌλ‘ μ€λ₯λ₯Ό μλ €μ£Όμ΄ λΉ λ₯΄κ² μμ ν μ μλλ‘ λμμ€λ€.
- μλ² λ¦¬μμ€ μ μ½: μλͺ»λ λ°μ΄ν°κ° μλ²λ‘ μ μ‘λμ§ μλλ‘ λ§μ λΆνμν μλ² μμ²μ μ€μ΄κ³ , μλ²μ λΆνλ₯Ό μ€μΈλ€.
- 보μ 곡격 λ°©μ§: ν΄λΌμ΄μΈνΈ μΈ‘μμ κΈ°λ³Έμ μΈ μ λ ₯ κ²μ¦μ ν΅ν΄ XSS, SQL μΈμ μ λ±μ 곡격 μλλ₯Ό μΌμ°¨μ μΌλ‘ μ°¨λ¨ν μ μλ€.
λ€λ§, ν΄λΌμ΄μΈνΈ μΈ‘ κ²μ¦μ 보쑰μ μΈ λ³΄μ μ‘°μΉμ λΆκ³Όνλ€λ μ μ λͺ
μ¬ν΄μΌ νλ€. 곡격μλ ν΄λΌμ΄μΈνΈ μΈ‘μμ μ€νλλ μλ°μ€ν¬λ¦½νΈλ₯Ό λΉνμ±ννκ±°λ, ν΄λΌμ΄μΈνΈ κ²μ¦μ μ°νν μ μλ λ€μν λ°©λ²μ μ¬μ©ν μ μκΈ° λλ¬Έμ λ°λμ μλ² μΈ‘μμ μΆκ°μ μΈ κ²μ¦μ μνν΄μΌ νλ€.
2. μ λ ₯ κ²μ¦μ΄ νμν μ£Όμ 보μ μν
κ·ΈλΌ μ§κΈλΆν° μ
λ ₯ κ²μ¦μ΄ νμν μ£Όμ 보μ μνμ λν΄ μμ보μ.
(1) XSS λ°©μ§ (Cross-Site Scripting)
XSS 곡격μ 곡격μκ° μ
μμ μΈ μ€ν¬λ¦½νΈλ₯Ό λ€λ₯Έ μ¬μ©μμ λΈλΌμ°μ μμ μ€ννλλ‘ νλ 곡격μ΄λ€. ν΄λΌμ΄μΈνΈ μΈ‘μμ μ΄λ¬ν 곡격μ λ°©μ§νλ €λ©΄ μ
λ ₯ λ°μ΄ν°μ HTML νκ·Έλ μλ°μ€ν¬λ¦½νΈ μ½λκ° ν¬ν¨λμ§ μλλ‘ νν°λ§ν΄μΌ νλ€.
1) XSS μ·¨μ½μ μ΄ μλ μ½λ μμ
λ€μμ μ¬μ©μκ° μ
λ ₯ν μ΄λ¦μ κ·Έλλ‘ μΆλ ₯νλ κΈ°λ₯μ΄ μλ κ°λ¨ν μ½λ μμ μ΄λ€. ν΄λΉ μ½λμ XSS μ·¨μ½μ κ³Ό λ°©μ§νλ λ²μ λν΄ μμ보μ.
μλ μ½λμμλ μ¬μ©μκ° μ
λ ₯ν κ°μ μμ
location.search
μμ κ°μ Έμμ document.write()
λ©μλλ₯Ό μ΄μ©ν΄ νμ΄μ§μ μΆλ ₯νλ€. μ΄ μ½λλ μ
λ ₯ κ°μ μΈμ½λ©νκ±°λ κ²μ¦νμ§ μκ³ κ·Έλλ‘ HTMLμ μ½μ
νκΈ° λλ¬Έμ, μ
μ± μ€ν¬λ¦½νΈλ₯Ό ν¬ν¨ν μ
λ ₯ κ°μ΄ μ€νλ μ μλ€. μλ₯Ό λ€μ΄ 곡격μκ° name
νλΌλ―Έν°μ μλ°μ€ν¬λ¦½νΈλ₯Ό μ
λ ₯νλ€λ©΄ μ
μ± μ€ν¬λ¦½νΈλ₯Ό μ€νμν¬ μ μλ κ²μ΄λ€. input[name="name"]
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>XSS Vulnerable Page</title> </head> <body> <h1>Welcome</h1> <form method="GET"> <label for="name">Enter your name:</label> <input type="text" id="name" name="name"> <button type="submit">Submit</button> </form> <div> <h2>Hello, <!-- XSS μ·¨μ½μ μ΄ μλ μ½λ --> <script> document.write(decodeURIComponent(location.search.split('=')[1])); </script>! </h2> </div> </body> </html>
μ μ½λμ λν 곡격 μλ리μ€λ μλμ κ°λ€.
곡격 μλ리μ€
- μ¬μ©μκ° λ€μ URLλ‘ μ μνλ€κ³ κ°μ νμ:
<http://example.com?name=><script>alert('XSS!');</script>
- νμ΄μ§λ μ
λ ₯λ
name
κ°μ κ²μ¦νμ§ μκ³ κ·Έλλ‘ μΆλ ₯νλ―λ‘,<script>alert('XSS!');</script>
μ€ν¬λ¦½νΈκ° μ€νλλ€.
- κ²°κ³Όμ μΌλ‘, μ¬μ©μμ λΈλΌμ°μ μμ
alert('XSS!')
κ° μ€νλλ©°, μ΄λ‘ μΈν΄ 곡격μκ° μνλ©΄ λμ± μ μμ μΈ μ½λλ₯Ό μ€νν μ μλ€.
2) XSS λ°©μ§λ₯Ό μν μ½λ μμ
XSS 곡격μ λ°©μ§νλ €λ©΄ μ
λ ₯ λ°μ΄ν°λ₯Ό κ·Έλλ‘ μΆλ ₯νμ§ λ§κ³ , HTML μν°ν°λ‘ μΈμ½λ©νκ±°λ, ν΄λΉ μ
λ ₯ κ°μ κ²μ¦ν΄μΌ νλ€. HTML μν°ν°λ‘ μΈμ½λ©νλ μμ λ μ½λλ λ€μκ³Ό κ°λ€.
<!-- μ€λ΅... --> <div> <h2>Hello, <!-- XSS λ°©μ§λ₯Ό μν΄ λ°μ΄ν°λ₯Ό μμ νκ² μΆλ ₯ --> <script> function sanitizeInput(str) { // μ μ± μ€ν¬λ¦½νΈ μ°¨λ¨μ μν΄ νΉμ λ¬Έμλ₯Ό HTML μν°ν°λ‘ λ³ν // <, >, &, ", ' λ±μ νΉμ λ¬Έμκ° HTMLμ΄λ μλ°μ€ν¬λ¦½νΈλ‘ ν΄μλμ§ μμ return str.replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, """) .replace(/'/g, "'"); } const params = new URLSearchParams(window.location.search); const name = params.get('name'); if (name) { document.write(sanitizeInput(decodeURIComponent(name))); } </script> </h2> </div> <!-- μ€λ΅... -->
μ΄μ μ¬μ©μκ° μ
λ ₯ν κ°μ μ
μ± μ€ν¬λ¦½νΈκ° ν¬ν¨λμ΄ μμ΄λ, κ·Έκ²μ΄ μ€νλμ§ μκ³ λ¨μν ν
μ€νΈλ‘ μΆλ ₯λλ€. μλ₯Ό λ€μ΄, 곡격μκ° URLμ
http://example.com?name=<script>alert('XSS!');</script>
λ₯Ό μ
λ ₯νλλΌλ, νμ΄μ§μμλ <script>alert('XSS!');</script>
λ₯Ό κ·Έλλ‘ μΆλ ₯ν λΏ μ€ννμ§ μλλ€.(2) SQL μΈμ μ λ°©μ§
ν΄λΌμ΄μΈνΈ μΈ‘μμ SQL μΈμ μ
μ΄ μ§μ μ μΌλ‘ λ°μνμ§ μμ§λ§, μλͺ»λ μ
λ ₯ μ²λ¦¬λ₯Ό ν΅ν΄ μλ² μΈ‘μμ SQL μΈμ μ
μ μ λ°ν μ μλ€. μ¦, ν΄λΌμ΄μΈνΈκ° μλ²λ‘ μ
μ± μ
λ ₯μ μ μ‘νλ©΄, μλ²κ° μ΄λ₯Ό μ λλ‘ μ²λ¦¬νμ§ λͺ»ν΄ SQL μΈμ μ
곡격μ λΉνκ² λλ κ²μ΄λ€. ν΄λΌμ΄μΈνΈ μΈ‘μμ SQL μΈμ μ
곡격μ λ°©μ§νλ €λ©΄ μ
λ ₯ κ°μ μ μ νκ² κ²μ¦νκ³ ν΄λΌμ΄μΈνΈμ μλ² κ°μ ν΅μ μ μμ νκ² μ μ§νλ κ²μ΄ μ€μνλ€.
1) SQL μΈμ μ μ·¨μ½μ μ΄ μλ μ½λ μμ
λ€μμ κ°λ¨ν HTMLκ³Ό JavaScript μ½λλ‘ κ΅¬μ±λ ν΄λΌμ΄μΈνΈ μΈ‘ νΌμ΄λ€. μ΄ μ½λλ μ¬μ©μμ IDμ λΉλ°λ²νΈλ₯Ό μ
λ ₯ λ°μ μλ²μ μ μ‘νλ€. μλ²κ° μ΄ μ
λ ₯ κ°μ κ²μ¦νμ§ μμΌλ©΄ SQL μΈμ μ
곡격μ λ°μ μ μλ€.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Login Page</title> </head> <body> <h1>Login</h1> <form id="loginForm" method="POST" action="login.php"> <label for="username">Username:</label> <input type="text" id="username" name="username"><br> <label for="password">Password:</label> <input type="password" id="password" name="password"><br> <button type="submit">Login</button> </form> </body> </html>
곡격 μλ리μ€
- μ¬μ©μκ°
username
νλμ μ μμ μΈ IDκ° μλ SQL μΈμ μ 곡격 λ¬Έμμ΄μ μ λ ₯ν μ μλ€. μλ₯Ό λ€μ΄, λ€μκ³Ό κ°μ κ°μ μ λ ₯ν μ μλ€.
' OR 1=1 --
- μλ²κ° μ΄ κ°μ μ²λ¦¬ν λ SQL μΏΌλ¦¬κ° λ€μκ³Ό κ°μ΄ μ‘°μλ μ μλ€.
SELECT * FROM users WHERE username = '' OR 1=1 -- ' AND password = 'password';
- μ΄ μΏΌλ¦¬λ νμ μ°Έμ΄ λκΈ° λλ¬Έμ, 곡격μλ λΉλ°λ²νΈλ₯Ό μ λ ₯νμ§ μκ³ λ λ°μ΄ν°λ² μ΄μ€μ λͺ¨λ μ¬μ©μλ₯Ό μ‘°ννκ±°λ κ΄λ¦¬μ κΆνμ μ»μ μ μλ€.
2) SQL μΈμ μ μ λ°©μ§ν μ μκ² μ½λ μμ
JavaScriptλ₯Ό μ΄μ©ν΄ ν΄λΌμ΄μΈνΈ μΈ‘μμ κ°λ¨ν μ
λ ₯ κ²μ¦μ μνν μ μλ€. SQL νΉμ λ¬Έμλ λΉμ μμ μΈ μ
λ ₯μ μ°¨λ¨νλ κΈ°λ³Έμ μΈ κ²μ¦μ μ μ©ν μ μλ€.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Login Page</title> <script> // usernameκ³Ό password νλμμ SQL μΈμ μ μ μ¬μ©λ μ μλ νΉμ λ¬Έμλ₯Ό κ²μ¬ function validateForm() { const username = document.getElementById('username').value; const password = document.getElementById('password').value; // κ°λ¨ν SQL μΈμ μ ν¨ν΄ νν°λ§ //', ", ;, -μ ν¬ν¨ν λ¬Έμμ΄μ΄ μλ κ²½μ°, μ¬μ©μμκ² κ²½κ³ λ₯Ό νμνκ³ νΌ μ μΆμ μ€λ¨ const sqlInjectionPattern = /['";--]/; if (sqlInjectionPattern.test(username) || sqlInjectionPattern.test(password)) { alert('Invalid characters in input.'); return false; // νΌ μ μΆ μ€λ¨ } return true; // νΌ μ μΆ νμ© } </script> </head> <body> <!-- μ€λ΅... --> </body> </html>
μμ κ°μ΄ ν΄λΌμ΄μΈνΈ μΈ‘μμ κ²μ¦μ ν΅ν΄ 쿼리μ νΉμ λ¬Έμκ° ν¬ν¨λμ§ μλλ‘ ν μ μλ€. νμ§λ§ ν΄λΌμ΄μΈνΈ μΈ‘ μ
λ ₯ κ²μ¦μ μ°νλ μ μκΈ° λλ¬Έμ, μλ²λ λ°λμ SQL μΈμ μ
μ λ°©μ΄ν΄μΌ νλ€. SQL μΈμ μ
μ μλ² μΈ‘μμ λ°λμ λ§μμΌ νλ©° ν΄λΌμ΄μΈνΈ μΈ‘μμλ§μ μ‘°μΉλ‘λ λ§μ μλ μλ€.
(3) CSRF λ°©μ§ (Cross-Site Request Forgery)
CSRF 곡격μ μ¬μ©μκ° μλνμ§ μμ μμ²μ κ°μ λ‘ μ€ννκ² λ§λλ 곡격μ΄λ€. μ΄λ₯Ό λ°©μ§νκΈ° μν΄ ν΄λΌμ΄μΈνΈ μΈ‘μμ CSRF ν ν°μ νμΈν μ μλ€.
*CSRF (Cross-Site Request Forgery)**λ μΉμ¬μ΄νΈμμ μ¬μ©μμ κΆνμ μ΄μ©ν΄ μ¬μ©μμ μλμ μκ΄μμ΄ μ
μμ μΈ μμ²μ μλ²λ‘ 보λ΄λ 곡격μ
λλ€. μ¬μ©μκ° μ¬μ΄νΈμ λ‘κ·ΈμΈν μνμμ 곡격μκ° μ€λΉν μ
μ± μ€ν¬λ¦½νΈ λλ λ§ν¬λ₯Ό ν΄λ¦νλ©΄, μ¬μ©μμ κΆνμΌλ‘ μλ²μ μμ²μ΄ μ μ‘λμ΄ μλμΉ μμ λμ(μ: κ³μ’ μ΄μ²΄, λΉλ°λ²νΈ λ³κ²½ λ±)μ μ€νν μ μμ΅λλ€.
곡격μλ μ¬μ©μμ μΈμ¦ μ 보λ₯Ό μ
μ©νμ¬ ν΄λΉ μ¬μ©μμ κΆνμΌλ‘ μλ²μ μμ²μ 보λ΄κΈ° λλ¬Έμ, 곡격μ μ¬μ©μκ° λ‘κ·ΈμΈν μνμμ λ μννκ² μ΄λ£¨μ΄μ§λλ€.
1) CSRF μ·¨μ½μ μ΄ μλ μ½λ μμ
μλμ κ°λ¨ν μ½λ μμλ μ¬μ©μκ° λ‘κ·ΈμΈν μνμμ λΉλ°λ²νΈλ₯Ό λ³κ²½ν μ μλ νμ΄μ§μ
λλ€. CSRF λ°©μ΄ μ‘°μΉκ° μμ κ²½μ°, 곡격μλ μ¬μ©μμ κΆνμΌλ‘ μ
μμ μΈ μμ²μ λ³΄λΌ μ μμ΅λλ€.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Change Password</title> </head> <body> <h1>Change Password</h1> <form id="passwordForm" method="POST" action="change_password.php"> <label for="newPassword">New Password:</label> <input type="password" id="newPassword" name="newPassword"><br> <button type="submit">Change Password</button> </form> </body> </html>
곡격 μλ리μ€
- μ¬μ©μκ° μ΄λ―Έ λ‘κ·ΈμΈλ μνμμ 곡격μκ° μ‘°μν μ μ± νμ΄μ§λ₯Ό λ°©λ¬Ένλ€.
- 곡격μλ λ€μκ³Ό κ°μ URLλ‘ μ¬μ©μμ κΆνμ μ΄μ©ν΄ λΉλ°λ²νΈ λ³κ²½ μμ²μ μ μ‘νλ€.
<img src="<http://example.com/change_password.php?newPassword=hacked123>" style="display:none;">
- μ¬μ©μκ° μ΄ νμ΄μ§λ₯Ό λ°©λ¬Ένλ©΄ μ΄λ―Έμ§κ° λ‘λλλ©΄μ
http://example.com/change_password.php?newPassword=hacked123
λ‘ μμ²μ΄ μλμΌλ‘ μ μ‘λλ€. μλ²λ μ¬μ©μκ° μμ²ν κ²μΌλ‘ μ°©κ°νκ³ λΉλ°λ²νΈλ₯Ό λ³κ²½νκ² λλ€.
1) CSRF λ°©μ§λ₯Ό μν μ½λ μμ
μλ²μμ μμ±λ CSRF ν ν°μ νΌμ μΆκ°νμ¬ ν΄λΌμ΄μΈνΈκ° μμ²μ λ³΄λΌ λλ§λ€ μλ²λ μ΄ ν ν°μ κ²μ¦νλ€. CSRF ν ν°μ μΈμ
λ§λ€ κ³ μ νλ©°, μ΄λ₯Ό ν΅ν΄ μ
μ± μ¬μ΄νΈμμλ μ μ ν ν ν°μ ν¬ν¨ν μμ²μ λ³΄λΌ μ μκ² λλ€.
<!-- μ€λ΅.. --> <!-- CSRF ν ν°μ νΌμ μΆκ° --> <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>"> <!-- μ€λ΅.. -->
μμ κ°μ΄ ν΄λΌμ΄μΈνΈκ° μ μΆνλ λͺ¨λ νΌμλ CSRF ν ν°μ΄ ν¬ν¨λμ΄μΌ νλ€. μ΄ ν ν°μ μλ²μμ μμ±λ ν ν°κ³Ό μΌμΉν΄μΌ νλ―λ‘, 곡격μκ° μμλ‘ μ‘°μν μμ²μ ν ν°μ΄ μΌμΉνμ§ μμ κ²μ΄λ―λ‘ μ€ν¨νκ² λλ€.
(4) νμΌ μ λ‘λ κ²μ¦
μ¬μ©μκ° νΉμ νμΌμ μ
λ‘λνλ €κ³ νλ€κ³ κ°μ ν΄ λ³΄μ. λ§μ½ μ¬μ©μκ° μ
λ‘λν νμΌμ΄ μλ²μμ μꡬνλ νμΌ νμμ΄ μλλΌλ©΄ μ΄λ€ λ¬Έμ κ° μΌμ΄λ κΉ? μλ₯Ό λ€μ΄
.exe
λ .js
μ κ°μ ν¬λ§·μ μ
μ± νμΌμΌ κ²½μ°, 보μ λ¬Έμ κ° λ°μν μ μλ€. λ°λΌμ ν΄λΌμ΄μΈνΈ μΈ‘μμλ νμΌμ νμμ΄ μ μ νμ§, μμ νμ§ μ¬λΆλ₯Ό λ°λμ νμΈν΄μΌ νλ€.1) νμΌ μ λ‘λ κ²μ¦μ΄ μλ μ·¨μ½ν μ½λ
μλλ νμΌ μ
λ‘λλ₯Ό μ²λ¦¬νλ κ°λ¨ν HTML νΌκ³Ό JavaScript μ½λμ΄λ€. ν΄λΌμ΄μΈνΈμμ νμΌ μ νμ΄λ ν¬κΈ°μ λν κ²μ¦μ΄ μμΌλ―λ‘, μ¬μ©μκ° μ
μ± νμΌμ μ
λ‘λν μ μλ€.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>File Upload</title> </head> <body> <h1>Upload a File</h1> <form id="uploadForm" method="POST" action="upload.php" enctype="multipart/form-data"> <input type="file" name="file" id="file"><br> <button type="submit">Upload</button> </form> </body> </html>
곡격 μλ리μ€
- 곡격μλ μ
μ± μ€ν¬λ¦½νΈκ° ν¬ν¨λ
.php
,.js
,.exe
λ±μ νμΌμ μ λ‘λν μ μλ€.
- μλ₯Ό λ€μ΄,
shell.php
μ κ°μ νμΌμ μ λ‘λνλ©΄ μλ²λ μ΄ νμΌμ μ μ₯ν μ μκ³ , 곡격μλ ν΄λΉ νμΌμ μ κ·Όνμ¬ μλ²μμ λͺ λ Ήμ μ€ννκ±°λ κΆνμ μ»μ μ μλ€.
<?php // μ μ± νμΌ μμ (shell.php) echo "This is a shell"; system($_GET['cmd']); ?>
곡격μλ μ΄ νμΌμ μλ²μ μ
λ‘λν ν, URLμ ν΅ν΄ λͺ
λ Ήμ μ€νν μ μλ€.
<http://example.com/uploads/shell.php?cmd=ls>
μ΄λ‘ μΈν΄ μλ²μμ μμμ λͺ
λ Ήμ΄ μ€νλ μ μκ³ , μ¬κ°ν 보μ λ¬Έμ κ° λ°μν μ μλ€.
2) νμΌ μ λ‘λ κ²μ¦μ΄ μΆκ°λ μ½λ μμ
νμΌ μ
λ‘λλ ν΄λΌμ΄μΈνΈμ μλ² κ°μ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°λ μ€μν λΆλΆ μ€ νλμ΄λ©°, μ΄ κ³Όμ μμ μ μ ν 보μ μ‘°μΉκ° μ·¨ν΄μ§μ§ μμΌλ©΄ 곡격μκ° μ
μ± νμΌμ μ
λ‘λνμ¬ μλ²μ μ
μν₯μ λΌμΉ μ μλ€. μλλ νμΌ νμ₯μμ νμΌ ν¬κΈ°λ₯Ό ν΄λΌμ΄μΈνΈμμ 미리 νμΈνκ³ , νμ©λμ§ μλ νμΌμ μ
λ‘λνμ§ λͺ»νλλ‘ νλ μ½λμ΄λ€.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>File Upload</title> <script> function validateFile() { const fileInput = document.getElementById('file'); const file = fileInput.files[0]; // νμ©λλ νμΌ νμ₯μ const allowedExtensions = ['jpg', 'jpeg', 'png', 'gif']; const fileSizeLimit = 2 * 1024 * 1024; // 2MB μ ν const fileExtension = file.name.split('.').pop().toLowerCase(); // νμΌ νμ₯μ νμΈ if (!allowedExtensions.includes(fileExtension)) { alert('Only JPG, JPEG, PNG, and GIF files are allowed.'); return false; } // νμΌ ν¬κΈ° νμΈ if (file.size > fileSizeLimit) { alert('File size must be less than 2MB.'); return false; } return true; } </script> </head> <body> <h1>Upload a File</h1> <form id="uploadForm" method="POST" action="upload.php" enctype="multipart/form-data" onsubmit="return validateFile();"> <input type="file" name="file" id="file"><br> <button type="submit">Upload</button> </form> </body> </html>
ν΄λΌμ΄μΈνΈ μΈ‘μμλ νμΌμ μ νκ³Ό ν¬κΈ°, νμ₯μ λ±μ κ²μ¬νλ κΈ°λ³Έμ μΈ λ³΄μ μ‘°μΉλ₯Ό μ μ©ν μ μλ€. νμ§λ§ ν΄λΌμ΄μΈνΈ μΈ‘ κ²μ¦μ μ¬μ©μ κ²½ν ν₯μμ λμμ΄ λμ§λ§, μ λ’°ν μ μλ νκ²½μμλ μ½κ² μ°νλ μ μκΈ° λλ¬Έμ μλ² μΈ‘μμλ λ°λμ κ²μ¦μ μνν΄μΌ νλ€.
(6) μ λ ₯ λ°μ΄ν° κΈΈμ΄ μ ν
λ λ€λ₯Έ μλ‘, μ¬μ©μκ° λΉλ°λ²νΈλ₯Ό μ
λ ₯νλ€κ³ κ°μ ν΄ λ³΄μ. λ§μ½ μ
λ ₯λ λΉλ°λ²νΈκ° λ°μ΄ν°λ² μ΄μ€μ μ μ₯ν μ μλ κΈΈμ΄λ³΄λ€ κΈΈλ€λ©΄, μλ²μ μ€λ₯κ° λ°μν μ μλ€. λ°λΌμ ν΄λΌμ΄μΈνΈμμ μ
λ ₯ λ°μ΄ν°μ κΈΈμ΄λ₯Ό μ ννμ¬ μ΄λ° μ€λ₯λ₯Ό μλ°©ν΄μΌ νλ€.
ν΄λΌμ΄μΈνΈ μΈ‘μμ μ
λ ₯ λ°μ΄ν°μ κΈΈμ΄λ₯Ό μ ννμ§ μμΌλ©΄, λ²νΌ μ€λ²νλ‘μ°(Buffer Overflow)λ μλΉμ€ κ±°λΆ κ³΅κ²©(Denial of Service, DoS) λ±κ³Ό κ°μ λ€μν 곡격μ λ
ΈμΆλ μ μλ€. νΉν μλ²λ μ ν리μΌμ΄μ
μμ μ΄ μ
λ ₯μ κ·Έλλ‘ μ²λ¦¬ν κ²½μ°, μ±λ₯ μ ν, λ°μ΄ν° μ μ€, 보μ μ·¨μ½μ λ°μ λ±μ λ¬Έμ κ° μκΈΈ μ μλ€.
1) μ λ ₯ λ°μ΄ν° κΈΈμ΄ μ νμ΄ μλ μ·¨μ½ν μ½λ μμ
λ€μμ ν΄λΌμ΄μΈνΈ μΈ‘μμ μ
λ ₯ λ°μ΄ν°μ λν κΈΈμ΄ μ νμ΄ μλ κ°λ¨ν νΌμ΄λ€. μ΄ νΌμ μλ²μ λ°μ΄ν° μ μ‘μ νμ©νμ§λ§, ν΄λΌμ΄μΈνΈμμ μ
λ ₯λ λ°μ΄ν°μ κΈΈμ΄λ₯Ό μ ν κ²μ¦νμ§ μλλ€.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Simple Form</title> </head> <body> <h1>Submit Your Feedback</h1> <form id="feedbackForm" method="POST" action="submit_feedback.php"> <label for="feedback">Feedback:</label><br> <textarea id="feedback" name="feedback"></textarea><br> <button type="submit">Submit</button> </form> </body> </html>
μ νΌμλ κΈΈμ΄ μ νμ΄ μμΌλ―λ‘ μ¬μ©μκ° μμλ‘ κΈΈμ΄λ₯Ό μ΄κ³Όνλ λ°μ΄ν°, μ¬μ§μ΄ λ§€μ° ν° λ°μ΄ν°λ₯Ό μ
λ ₯ν μ μλ€. μ΄λ‘ μΈν΄ μλ²λ λ§μ λ°μ΄ν°λ₯Ό μ²λ¦¬ν΄μΌ νλ©°, κ³Όλν λ©λͺ¨λ¦¬ μ¬μ©μΌλ‘ μΈν΄ μλ²κ° λ€μ΄λκ±°λ μκΈ°μΉ μμ λμμ μ λ°ν μ μλ€.
곡격 μλ리μ€
- λ²νΌ μ€λ²νλ‘μ°(Buffer Overflow): ν΄λΌμ΄μΈνΈμμ λ§€μ° κΈ΄ λ¬Έμμ΄μ μ λ ₯νκ³ μλ²λ‘ μ μ‘νλ©΄, μλ²μ λ©λͺ¨λ¦¬κ° λμ³ κ³΅κ²©μκ° μλ²μ μ μμ μΈ μ½λλ₯Ό μ£Όμ νκ±°λ μκΈ°μΉ μμ νλμ μ λν μ μλ€.
- μλΉμ€ κ±°λΆ κ³΅κ²©(Denial of Service, DoS): ν΄λΌμ΄μΈνΈκ° λ§€μ° ν° λ°μ΄ν°λ₯Ό μ¬λ¬ λ² λ³΄λ΄λ©΄μ μλ²μ μμμ μλͺ¨μν€λ©΄, μλ²μ μλ΅ μκ°μ΄ λλ €μ§κ±°λ μμ ν μ€λ¨λ μ μλ€.
2) μ λ ₯ λ°μ΄ν° κΈΈμ΄ μ ννλλ‘ μ½λ μμ
ν΄λΌμ΄μΈνΈ μΈ‘μμ μ
λ ₯ λ°μ΄ν°μ κΈΈμ΄λ₯Ό μ ννλ κ²μ 첫 λ²μ§Έ λ°©μ΄μ μ ν΄λΉνλ€. νμ§λ§ μ΄ κ²μ¦μ μ½κ² μ°νλ μ μκΈ° λλ¬Έμ, μλ² μΈ‘μμ λ°λμ μΆκ°μ μΈ κ²μ¦μ΄ νμνλ€.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Feedback Form</title> <script> function validateInput() { const feedback = document.getElementById('feedback').value; const maxLength = 500; // μ΅λ κΈμ μ μ ν if (feedback.length > maxLength) { alert(`Feedback cannot exceed ${maxLength} characters.`); return false; } return true; } </script> </head> <!-- μ€λ΅.. -->
μ§κΈκΉμ§ ν΄λΌμ΄μΈνΈ μΈ‘μμμ μ
λ ₯ κ²μ¦μ λν΄ μμ보μλ€. ν΄λΌμ΄μΈνΈ μ¬μ΄λ μ
λ ₯ κ²μ¦μΌλ‘ κΈ°λ³Έμ μΈ λ³΄μ μνμ μ€μΌ μ μμ§λ§, μ΄λ 보쑰μ μΈ λ°©μ΄μ±
μ λΆκ³Όνλ€λ κ²μ κΌ κΈ°μ΅νμ. 보μ 곡격μ μ¬μ©μκ° μλ°μ€ν¬λ¦½νΈλ₯Ό λΉνμ±ννκ±°λ ν΄λΌμ΄μΈνΈ κ²μ¦μ μ°ννλ λ°©λ²μΌλ‘ μλλ μ μκΈ° λλ¬Έμ, λͺ¨λ 보μ κ²μ¦μ μλ² μΈ‘μμλ λ°λμ μ΄λ£¨μ΄μ ΈμΌ νλ€.