현재 위치: > 최신 기사 목록> CSRF 공격을 방지하기 위해 htmlspecialchars를 사용하는 것이 실제로 효과적입니까? 보호 원칙 및 사용 기술 분석

CSRF 공격을 방지하기 위해 htmlspecialchars를 사용하는 것이 실제로 효과적입니까? 보호 원칙 및 사용 기술 분석

M66 2025-07-18

htmlspecialchars () 의 실제 사용

htmlspecialchars () 는 XSS를 방지하는 기능입니다 (크로스 사이트 스크립팅 공격). 그 목적은 html (예 : < , > , " , & )의 특수 문자를 HTML 엔티티로 변환하여 페이지에서 사용자가 제출 한 악성 스크립트가 페이지에서 실행되는 것을 방지하는 것입니다.

 <?php
$user_input = '<script>alert("XSS")</script>';
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
?>

출력 결과는 다음과 같습니다.

 &lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;

이 코드는 HTML에 악의적 인 JavaScript 주입을 효과적으로 방지하지만 이는 CSRF 공격 방어와 직접적인 관계가 거의 없습니다.


CSRF 공격의 원리 분석

CSRF는 사용자의 "기록 된 상태"를 사용합니다. 공격자는 사용자가 링크를 클릭하거나 이미지/iframe에 액세스하도록 유도하고 특정 웹 사이트에서 사용자의 현재 로그인 상태를 사용하여 요청합니다. 예를 들어:

 <img src="https://m66.net/delete_account.php" />

사용자가 m66.net 에 로그인하고 서버가 확인을 수행하지 않은 경우이 요청은 실제로 사용자 계정을 삭제할 수 있습니다.

이 공격의 핵심은 사용자가 상태 변경에 대한 요청을 수행하지 않았으며 서버가 요청을 신뢰한다는 것입니다.


htmlspecialchars ()가 CSRF를 방지 할 수없는 이유

htmlspecialchars () 는 "출력 단계"에서 작용하고 주로 브라우저가 악성 스크립트를 구문 분석하는 것을 방지합니다. CSRF 공격은 사용자의 브라우저에서 자동으로 시작되거나 유도 된 요청이며 페이지에 출력이 없어도 트리거 될 수 있습니다.

다시 말해, CSRF는 "사용자의 신원 위장 요청"이며 출력 컨텐츠가 피해 졌는지 여부와 관련이 없습니다. 따라서 htmlspecialchars ()는 CSRF 공격을 방지하지 않습니다.


CSRF를 방어하는 올바른 방법

  1. CSRF 토큰 사용

가장 효율적인 방법은 무작위로 생성 된 CSRF 토큰을 양식에 추가하고 요청을 처리 할 때 확인하는 것입니다. 예를 들어:

 <?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
?>
<form method="POST" action="https://m66.net/update_profile.php">
    <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>" />
    <!-- 다른 형태의 필드 -->
    <button type="submit">제출하다</button>
</form>
<?php
} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
        die("불법 요청!");
    }
    // 업데이트 작업을 수행하십시오
}
?>
  1. 참조 또는 원점 헤더를 확인하십시오

완전히 의존 할 수는 없지만 일부 시나리오에서 요청이 합법적인지 판단하는 데 도움이 될 수 있습니다. 예를 들어:

 <?php
$referer = $_SERVER['HTTP_REFERER'] ?? '';
if (parse_url($referer, PHP_URL_HOST) !== 'm66.net') {
    die("불법 출처");
}
?>
  1. Samesite 쿠키 속성을 사용하십시오

현대식 브라우저는 Samesite = strict 또는 samesite = lax 의 쿠키 속성을 설정하여 제 3자가 쿠키를 요청하는 것을 방지합니다.

 setcookie('session_id', $value, [
    'samesite' => 'Strict',
    'secure' => true,
    'httponly' => true
]);